Skip to content

Commit e6434a0

Browse files
Merge branch 'master' of github.com:GeoNode/geonode into ISSUE_12996
2 parents 0922330 + 180d0a2 commit e6434a0

File tree

24 files changed

+132
-33
lines changed

24 files changed

+132
-33
lines changed

create-envfile.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,8 @@ def shuffle(chars):
4242
random.shuffle(chars_as_list)
4343
return "".join(chars_as_list)
4444

45-
4645
_simple_chars = shuffle(string.ascii_letters + string.digits)
47-
_strong_chars = shuffle(
48-
string.ascii_letters + string.digits + string.punctuation.replace('"', "").replace("'", "").replace("`", "")
49-
)
50-
46+
_strong_chars = shuffle(string.ascii_letters + string.digits + "#%*._~")
5147

5248
def generate_env_file(args):
5349
# validity checks

docker-compose-test.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ services:
9292

9393
# Geoserver backend
9494
geoserver:
95-
image: geonode/geoserver:2.24.3-latest
95+
image: geonode/geoserver:2.24.4-latest
9696
container_name: geoserver4${COMPOSE_PROJECT_NAME}
9797
healthcheck:
9898
test: "curl -m 10 --fail --silent --write-out 'HTTP CODE : %{http_code}\n' --output /dev/null http://geoserver:8080/geoserver/ows"
@@ -118,7 +118,7 @@ services:
118118
condition: service_healthy
119119

120120
data-dir-conf:
121-
image: geonode/geoserver_data:2.24.3-latest
121+
image: geonode/geoserver_data:2.24.4-latest
122122
container_name: gsconf4${COMPOSE_PROJECT_NAME}
123123
entrypoint: sleep infinity
124124
volumes:

docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ services:
9191

9292
# Geoserver backend
9393
geoserver:
94-
image: geonode/geoserver:2.24.3-latest
94+
image: geonode/geoserver:2.24.4-latest
9595
container_name: geoserver4${COMPOSE_PROJECT_NAME}
9696
healthcheck:
9797
test: "curl -m 10 --fail --silent --write-out 'HTTP CODE : %{http_code}\n' --output /dev/null http://geoserver:8080/geoserver/ows"
@@ -117,7 +117,7 @@ services:
117117
condition: service_healthy
118118

119119
data-dir-conf:
120-
image: geonode/geoserver_data:2.24.3-latest
120+
image: geonode/geoserver_data:2.24.4-latest
121121
container_name: gsconf4${COMPOSE_PROJECT_NAME}
122122
entrypoint: sleep infinity
123123
volumes:

geonode/base/api/views.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -680,11 +680,16 @@ def set_thumbnail_from_bbox(self, request, resource_id, *args, **kwargs):
680680
try:
681681
resource = ResourceBase.objects.get(id=ast.literal_eval(resource_id))
682682

683+
map_thumb_from_bbox = False
684+
if isinstance(resource.get_real_instance(), Map):
685+
map_thumb_from_bbox = True
686+
683687
if not isinstance(resource.get_real_instance(), (Dataset, Map)):
684688
raise NotImplementedError("Not implemented: Endpoint available only for Dataset and Maps")
685689

686690
request_body = request.data if request.data else json.loads(request.body)
687691
try:
692+
# bbox format: (xmin, xmax, ymin, ymax)
688693
bbox = request_body["bbox"] + [request_body["srid"]]
689694
zoom = request_body.get("zoom", None)
690695
except MultiValueDictKeyError:
@@ -695,7 +700,11 @@ def set_thumbnail_from_bbox(self, request, resource_id, *args, **kwargs):
695700
zoom = request_body.get("zoom", None)
696701

697702
thumbnail_url = create_thumbnail(
698-
resource.get_real_instance(), bbox=bbox, background_zoom=zoom, overwrite=True
703+
resource.get_real_instance(),
704+
bbox=bbox,
705+
background_zoom=zoom,
706+
overwrite=True,
707+
map_thumb_from_bbox=map_thumb_from_bbox,
699708
)
700709
return Response(
701710
{"message": "Thumbnail correctly created.", "success": True, "thumbnail_url": thumbnail_url}, status=200

geonode/documents/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def clean(self):
163163
raise forms.ValidationError(_("A document cannot have both a file and a url."))
164164

165165
if extension:
166-
cleaned_data["extension"] = extension.replace(".", "")
166+
cleaned_data["extension"] = extension.replace(".", "").lower()
167167

168168
return cleaned_data
169169

geonode/documents/migrations/0037_delete_documentresourcelink.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ class Migration(migrations.Migration):
1111

1212
operations = [
1313
migrations.RunSQL(
14-
"INSERT INTO base_linkedresource(source_id, target_id, internal)"
14+
"INSERT INTO base_linkedresource(source_id, target_id, internal) "
1515
"SELECT document_id, object_id, false as internal "
16-
"FROM documents_documentresourcelink;"
16+
"FROM documents_documentresourcelink "
17+
"WHERE EXISTS (SELECT 1 FROM base_resourcebase base WHERE base.id=object_id);"
1718
),
1819
migrations.DeleteModel(
1920
name="DocumentResourceLink",

geonode/documents/tests.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
from unittest.mock import patch
3434
from urllib.parse import urlparse
35+
from pathlib import Path
3536

3637
from django.urls import reverse
3738
from django.conf import settings
@@ -42,7 +43,7 @@
4243

4344
from guardian.shortcuts import get_anonymous_user
4445

45-
from geonode.assets.utils import create_asset_and_link
46+
from geonode.assets.utils import create_asset_and_link, get_default_asset
4647
from geonode.base.forms import LinkedResourceForm
4748
from geonode.maps.models import Map
4849
from geonode.layers.models import Dataset
@@ -194,6 +195,25 @@ def test_create_document_url_view(self):
194195
d = Document.objects.get(title="GeoNode Map")
195196
self.assertEqual(d.doc_url, "http://www.geonode.org/map.pdf")
196197

198+
def test_uploaded_csv_with_uppercase_extension(self):
199+
"""
200+
The extension of the file should always be lowercase
201+
"""
202+
203+
self.client.login(username="admin", password="admin")
204+
try:
205+
with open(os.path.join(os.path.dirname(__file__), "tests/data/test.CSV"), "rb") as f:
206+
data = {"title": "CSV with uppercase extension", "doc_file": f, "extension": "CSV"}
207+
self.client.post(reverse("document_upload"), data=data)
208+
d = Document.objects.get(title="CSV with uppercase extension")
209+
# verify that the extension is not lowercase
210+
self.assertEqual(d.extension, "csv")
211+
# be sure that also the file extension is not lowercase
212+
asset = get_default_asset(d)
213+
self.assertEqual(Path(asset.location[0]).suffix, ".csv")
214+
finally:
215+
Document.objects.filter(title="CSV with uppercase extension").delete()
216+
197217
def test_upload_document_form(self):
198218
"""
199219
Tests the Upload form.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Username; Identifier;First name;Last name
2+
booker12;9012;Rachel;Booker
3+
grey07;2070;Laura;Grey
4+
johnson81;4081;Craig;Johnson
5+
jenkins46;9346;Mary;Jenkins
6+
smith79;5079;Jamie;Smith

geonode/documents/views.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@
5353
from geonode.base.models import Thesaurus, TopicCategory
5454
from geonode.base import enumerations
5555

56+
from pathlib import Path
57+
5658
from .utils import get_download_response
5759

5860
from .models import Document
@@ -162,7 +164,8 @@ def form_valid(self, form):
162164
if file:
163165
tempdir = mkdtemp()
164166
dirname = os.path.basename(tempdir)
165-
filepath = storage_manager.save(f"{dirname}/{file.name}", file)
167+
name = Path(file.name)
168+
filepath = storage_manager.save(f"{dirname}/{name.stem}{name.suffix.lower()}", file)
166169
storage_path = storage_manager.path(filepath)
167170
self.object = resource_manager.create(
168171
None,

geonode/metadata/api/views.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
from geonode.base.utils import remove_country_from_languagecode
3939
from geonode.base.views import LinkedResourcesAutocomplete, RegionAutocomplete, HierarchicalKeywordAutocomplete
4040
from geonode.groups.models import GroupProfile
41+
from geonode.metadata.i18n import get_localized_label
4142
from geonode.metadata.manager import metadata_manager
4243
from geonode.people.utils import get_available_users
4344

@@ -96,32 +97,35 @@ def schema(self, request, pk=None):
9697
def schema_instance(self, request, pk=None):
9798
try:
9899
resource = ResourceBase.objects.get(pk=pk)
100+
lang = request.query_params.get("lang", get_language_from_request(request)[:2])
99101

100102
if request.method == "GET":
101-
lang = request.query_params.get("lang", get_language_from_request(request)[:2])
102103
schema_instance = metadata_manager.build_schema_instance(resource, lang)
103104
return JsonResponse(
104105
schema_instance, content_type="application/schema-instance+json", json_dumps_params={"indent": 3}
105106
)
106107

107-
elif request.method in ("PUT"):
108+
elif request.method == "PUT":
108109
logger.debug(f"handling request {request.method}")
109110
# try:
110111
# logger.debug(f"handling content {json.dumps(request.data, indent=3)}")
111112
# except Exception as e:
112113
# logger.warning(f"Can't parse JSON {request.data}: {e}")
113114
errors = metadata_manager.update_schema_instance(resource, request.data)
114115

116+
msg_t = (
117+
("m_metadata_update_error", "Some errors were found while updating the resource")
118+
if errors
119+
else ("m_metadata_update_ok", "The resource was updated successfully")
120+
)
121+
msg = get_localized_label(lang, msg_t[0]) or msg_t[1]
122+
115123
response = {
116-
"message": (
117-
"Some errors were found while updating the resource"
118-
if errors
119-
else "The resource was updated successfully"
120-
),
124+
"message": msg,
121125
"extraErrors": errors,
122126
}
123127

124-
return Response(response, status=400 if errors else 200)
128+
return Response(response, status=422 if errors else 200)
125129

126130
except ResourceBase.DoesNotExist:
127131
result = {"message": "The dataset was not found"}

0 commit comments

Comments
 (0)