From 306a958beb4ad3b66a32ecefe61f3ce405654505 Mon Sep 17 00:00:00 2001 From: mattiagiupponi <51856725+mattiagiupponi@users.noreply.github.com> Date: Thu, 30 Jan 2025 11:00:03 +0100 Subject: [PATCH] [Fixes #12854] Fix migrations for create handlerinfo via asset (#12856) * [Fixes #12854] Fix migrations for create handlerinfo via asset --- geonode/upload/handlers/tiles3d/handler.py | 12 +++-- .../0051__align_resourcehandler_with_asset.py | 54 +++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 geonode/upload/migrations/0051__align_resourcehandler_with_asset.py diff --git a/geonode/upload/handlers/tiles3d/handler.py b/geonode/upload/handlers/tiles3d/handler.py index c80511b38b1..ee6f1f6f61c 100755 --- a/geonode/upload/handlers/tiles3d/handler.py +++ b/geonode/upload/handlers/tiles3d/handler.py @@ -79,11 +79,15 @@ def can_handle(_data) -> bool: the handler is able to handle the file or not """ base = _data.get("base_file") - if not base: + try: + base = _data.get("base_file") + if not base: + return False + ext = base.split(".")[-1] if isinstance(base, str) else base.name.split(".")[-1] + if ext in ["json"] and Tiles3DFileHandler.is_3dtiles_json(base): + return True + except Exception: return False - ext = base.split(".")[-1] if isinstance(base, str) else base.name.split(".")[-1] - if ext in ["json"] and Tiles3DFileHandler.is_3dtiles_json(base): - return True return False @staticmethod diff --git a/geonode/upload/migrations/0051__align_resourcehandler_with_asset.py b/geonode/upload/migrations/0051__align_resourcehandler_with_asset.py new file mode 100644 index 00000000000..8122d8d2e49 --- /dev/null +++ b/geonode/upload/migrations/0051__align_resourcehandler_with_asset.py @@ -0,0 +1,54 @@ +# Generated by Django 3.2.15 on 2022-10-04 13:03 + +import logging +from django.db import migrations +from geonode.upload.orchestrator import orchestrator +from geonode.layers.models import Dataset +from geonode.assets.utils import get_default_asset +from geonode.utils import get_allowed_extensions + +logger = logging.getLogger("django") + +def dataset_migration(apps, _): + NewResources = apps.get_model("upload", "ResourceHandlerInfo") + for old_resource in Dataset.objects.exclude( + pk__in=NewResources.objects.values_list("resource_id", flat=True) + ).exclude(subtype__in=["remote", None]): + # generating orchestrator expected data file + if old_resource.resourcehandlerinfo_set.first() is None: + if get_default_asset(old_resource): + available_choices = get_allowed_extensions() + not_main_files = ["xml", "sld", "zip", "kmz"] + base_file_choices = set(x for x in available_choices if x not in not_main_files) + output_files = dict() + for _file in get_default_asset(old_resource).location: + if _file.split(".")[-1] in base_file_choices: + output_files.update({"base_file": _file}) + break + else: + if old_resource.is_vector(): + output_files = {"base_file": "placeholder.shp"} + else: + output_files = {"base_file": "placeholder.tiff"} + + handler = orchestrator.get_handler(output_files) + if handler is None: + logger.error(f"Handler not found for resource: {old_resource}") + continue + handler.create_resourcehandlerinfo( + handler_module_path=str(handler), + resource=old_resource, + execution_id=None + ) + else: + logger.debug(f"resourcehandler info already exists for the resource") + + +class Migration(migrations.Migration): + dependencies = [ + ("upload", "0050_alter_uploadsizelimit_max_size"), + ] + + operations = [ + migrations.RunPython(dataset_migration), + ]