Skip to content

Commit

Permalink
fixed custom download handler test
Browse files Browse the repository at this point in the history
  • Loading branch information
giohappy committed Sep 8, 2023
1 parent 18f7ea6 commit 6669b21
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 20 deletions.
6 changes: 3 additions & 3 deletions geonode/base/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
)
from geonode.groups.models import GroupCategory, GroupProfile
from geonode.base.api.fields import ComplexDynamicRelationField
from geonode.layers.utils import load_dataset_download_handlers
from geonode.layers.utils import get_dataset_download_handlers, get_default_dataset_download_handler
from geonode.utils import build_absolute_uri
from geonode.security.utils import get_resources_with_perms, get_geoapp_subtypes
from geonode.resource.models import ExecutionRequest
Expand Down Expand Up @@ -315,12 +315,12 @@ def get_attribute(self, instance):
elif _instance.resource_type in ["dataset"]:
download_urls = []
# lets get only the default one first to set it
default_handler = load_dataset_download_handlers(default_only=True)[0]
default_handler = get_default_dataset_download_handler()
obj = default_handler(self.context.get("request"), _instance.alternate)
if obj.download_url:
download_urls.append({"url": obj.download_url, "ajax_safe": obj.is_ajax_safe, "default": True})
# then let's prepare the payload with everything
handler_list = load_dataset_download_handlers(additional_only=True)
handler_list = get_dataset_download_handlers(additional_only=True)
for handler in handler_list:
obj = handler(self.context.get("request"), _instance.alternate)
if obj.download_url:
Expand Down
7 changes: 6 additions & 1 deletion geonode/layers/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2258,11 +2258,16 @@ def get_download_response(self):
return HttpResponse(content=b"abcsfd2")


from geonode.layers.utils import clear_dataset_download_handlers


class TestCustomDownloadHandler(GeoNodeBaseTestSupport):
@override_settings(DEFAULT_DATASET_DOWNLOAD_HANDLER="geonode.layers.tests.DummyDownloadHandler")
def test_download_custom_handler(self):
dataset = create_single_dataset("test_dataset")
clear_dataset_download_handlers()
dataset = create_single_dataset("test_custom_download_dataset")
url = reverse("dataset_download", args=[dataset.alternate])
self.client.login(username="admin", password="admin")
response = self.client.get(url)
self.assertTrue(response.status_code == 200)
self.assertEqual(response.content, b"abcsfd2")
41 changes: 27 additions & 14 deletions geonode/layers/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -593,22 +593,35 @@ def mdata_search_by_type(request, filetype):
return len(files) == 1 and all([filetype in f for f in files])


default_dataset_download_handler_list = []
default_dataset_download_handler = None
dataset_download_handler_list = []


def load_dataset_download_handlers(default_only=False, additional_only=False):
if not default_dataset_download_handler_list and getattr(settings, "DEFAULT_DATASET_DOWNLOAD_HANDLER", None):
default_dataset_download_handler_list.append(import_string(settings.DEFAULT_DATASET_DOWNLOAD_HANDLER))
elif not dataset_download_handler_list and getattr(settings, "DATASET_DOWNLOAD_HANDLERS", None):
def get_dataset_download_handlers():
if not dataset_download_handler_list and getattr(settings, "DATASET_DOWNLOAD_HANDLERS", None):
dataset_download_handler_list.append(import_string(settings.DATASET_DOWNLOAD_HANDLERS[0]))

if default_only:
return default_dataset_download_handler_list
elif additional_only:
return dataset_download_handler_list
else:
all_dataset = default_dataset_download_handler_list + dataset_download_handler_list
if not all_dataset:
raise Exception("No dataset download handler defined")
return all_dataset
return dataset_download_handler_list


def get_default_dataset_download_handler():
global default_dataset_download_handler
if not default_dataset_download_handler and getattr(settings, "DEFAULT_DATASET_DOWNLOAD_HANDLER", None):
default_dataset_download_handler = import_string(settings.DEFAULT_DATASET_DOWNLOAD_HANDLER)

return default_dataset_download_handler


def set_default_dataset_download_handler(handler):
global default_dataset_download_handler
handler_module = import_string(handler)
if not handler_module in dataset_download_handler_list:
dataset_download_handler_list.append(handler_module)

default_dataset_download_handler = handler_module


def clear_dataset_download_handlers():
global default_dataset_download_handler
dataset_download_handler_list.clear()
default_dataset_download_handler = None
4 changes: 2 additions & 2 deletions geonode/layers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
from geonode.layers.utils import (
is_sld_upload_only,
is_xml_upload_only,
load_dataset_download_handlers,
get_default_dataset_download_handler,
validate_input_source,
)
from geonode.services.models import Service
Expand Down Expand Up @@ -737,7 +737,7 @@ def dataset_metadata_advanced(request, layername):

@csrf_exempt
def dataset_download(request, layername):
handler = load_dataset_download_handlers()[0]
handler = get_default_dataset_download_handler()
return handler(request, layername).get_download_response()


Expand Down

0 comments on commit 6669b21

Please sign in to comment.