Skip to content

Commit

Permalink
[Fixes #222] use default workspace instead of cascading (#225)
Browse files Browse the repository at this point in the history
  • Loading branch information
mattiagiupponi authored Feb 14, 2024
1 parent d67a99f commit 666b818
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 14 deletions.
3 changes: 1 addition & 2 deletions importer/handlers/common/raster.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
from geonode.resource.enumerator import ExecutionRequestAction as exa
from geonode.resource.manager import resource_manager
from geonode.resource.models import ExecutionRequest
from geonode.services.serviceprocessors.base import get_geoserver_cascading_workspace
from importer.api.exception import ImportException
from importer.celery_tasks import ErrorBaseTaskClass, import_orchestrator
from importer.handlers.base import BaseHandler
Expand Down Expand Up @@ -281,7 +280,7 @@ def import_resource(self, files: dict, execution_id: str, **kwargs) -> str:
skip_existing_layer=_exec.input_params.get("skip_existing_layer"),
overwrite_existing_layer=should_be_overwritten,
):
workspace = get_geoserver_cascading_workspace(create=False)
workspace = DataPublisher(None).workspace
user_datasets = Dataset.objects.filter(
owner=_exec.user, alternate=f"{workspace.name}:{layer_name}"
)
Expand Down
5 changes: 2 additions & 3 deletions importer/handlers/common/vector.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
from dynamic_models.schema import ModelSchemaEditor
from geonode.base.models import ResourceBase
from geonode.resource.enumerator import ExecutionRequestAction as exa
from geonode.services.serviceprocessors.base import get_geoserver_cascading_workspace
from geonode.layers.models import Dataset
from importer.celery_tasks import ErrorBaseTaskClass, create_dynamic_structure
from importer.handlers.base import BaseHandler
Expand Down Expand Up @@ -401,7 +400,7 @@ def import_resource(self, files: dict, execution_id: str, **kwargs) -> str:
return

def find_alternate_by_dataset(self, _exec_obj, layer_name, should_be_overwritten):
workspace = get_geoserver_cascading_workspace(create=False)
workspace = DataPublisher(None).workspace
dataset_available = Dataset.objects.filter(
alternate__iexact=f"{workspace.name}:{layer_name}"
)
Expand Down Expand Up @@ -434,7 +433,7 @@ def setup_dynamic_model(
"""

layer_name = self.fixup_name(layer.GetName())
workspace = get_geoserver_cascading_workspace(create=False)
workspace = DataPublisher(None).workspace
user_datasets = Dataset.objects.filter(
owner=username, alternate__iexact=f"{workspace.name}:{layer_name}"
)
Expand Down
5 changes: 3 additions & 2 deletions importer/handlers/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
from django.contrib.auth import get_user_model
from geonode.base.models import ResourceBase
from geonode.resource.models import ExecutionRequest
from geonode.services.serviceprocessors.base import get_geoserver_cascading_workspace
import logging
from dynamic_models.schema import ModelSchemaEditor
from django.utils.module_loading import import_string
from uuid import UUID

from importer.publisher import DataPublisher

logger = logging.getLogger(__name__)


Expand Down Expand Up @@ -53,7 +54,7 @@ def should_be_imported(layer: str, user: get_user_model(), **kwargs) -> bool:
- the publisher should republish the resource
- geonode should update it
"""
workspace = get_geoserver_cascading_workspace(create=False)
workspace = DataPublisher(None).workspace
exists = ResourceBase.objects.filter(
alternate=f"{workspace.name}:{layer}", owner=user
).exists()
Expand Down
47 changes: 40 additions & 7 deletions importer/publisher.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

from geonode import settings
from geonode.geoserver.helpers import create_geoserver_db_featurestore
from geonode.services.serviceprocessors.base import get_geoserver_cascading_workspace
from geoserver.catalog import Catalog
from geonode.utils import OGC_Servers_Handler
from django.utils.module_loading import import_string
Expand All @@ -28,9 +27,10 @@ def __init__(self, handler_module_path) -> None:
self.cat = Catalog(
service_url=ogc_server_settings.rest, username=_user, password=_password
)
self.workspace = get_geoserver_cascading_workspace(create=True)
self.workspace = self._get_default_workspace(create=True)

self.handler = import_string(handler_module_path)()
if handler_module_path is not None:
self.handler = import_string(handler_module_path)()

def extract_resource_to_publish(
self, files: dict, action: str, layer_name, alternate=None, **kwargs
Expand Down Expand Up @@ -90,9 +90,19 @@ def delete_resource(self, resource_name):
layer = self.get_resource(resource_name)
if layer and layer.resource:
self.cat.delete(layer.resource, purge="all", recurse=True)
store = self.cat.get_store(resource_name.split(":")[-1], workspace=os.getenv("DEFAULT_WORKSPACE", os.getenv("CASCADE_WORKSPACE", "geonode")))
store = self.cat.get_store(
resource_name.split(":")[-1],
workspace=os.getenv(
"DEFAULT_WORKSPACE", os.getenv("CASCADE_WORKSPACE", "geonode")
),
)
if not store:
store = self.cat.get_store(resource_name, workspace=os.getenv("DEFAULT_WORKSPACE", os.getenv("CASCADE_WORKSPACE", "geonode")))
store = self.cat.get_store(
resource_name,
workspace=os.getenv(
"DEFAULT_WORKSPACE", os.getenv("CASCADE_WORKSPACE", "geonode")
),
)
if store:
self.cat.delete(store, purge="all", recurse=True)

Expand Down Expand Up @@ -138,9 +148,32 @@ def sanity_checks(self, resources):
"""

for _resource in resources:
possible_layer_name = [_resource.get("name"), _resource.get("name").split(":")[-1], f"{self.workspace.name}:{_resource.get('name')}"]
res = list(filter(None, (self.cat.get_resource(x, workspace=self.workspace) for x in possible_layer_name)))
possible_layer_name = [
_resource.get("name"),
_resource.get("name").split(":")[-1],
f"{self.workspace.name}:{_resource.get('name')}",
]
res = list(
filter(
None,
(
self.cat.get_resource(x, workspace=self.workspace)
for x in possible_layer_name
),
)
)
if not res or (res and not res[0].projection):
raise PublishResourceException(
f"The SRID for the resource {_resource} is not correctly set, Please check Geoserver logs"
)

def _get_default_workspace(self, create=True):
"""Return the default geoserver workspace
The workspace can be created it if needed.
"""
name = getattr(settings, "DEFAULT_WORKSPACE", "geonode")
workspace = self.cat.get_workspace(name)
if workspace is None and create:
uri = f"http://www.geonode.org/{name}"
workspace = self.cat.create_workspace(name, uri)
return workspace

0 comments on commit 666b818

Please sign in to comment.