Skip to content

Commit 0ddbdaf

Browse files
[Fixes GeoNode#12951] CSV file preview fails (GeoNode#12999) (GeoNode#13002)
* [Fixes GeoNode#12951] CSV file preview fails * [Fixes GeoNode#12951] CSV file preview fails (cherry picked from commit 9b1e147) Co-authored-by: mattiagiupponi <51856725+mattiagiupponi@users.noreply.github.com>
1 parent 38527fe commit 0ddbdaf

5 files changed

Lines changed: 33 additions & 4 deletions

File tree

geonode/documents/forms.py

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

171171
if extension:
172-
cleaned_data["extension"] = extension.replace(".", "")
172+
cleaned_data["extension"] = extension.replace(".", "").lower()
173173

174174
return cleaned_data
175175

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
@@ -193,6 +194,25 @@ def test_create_document_url_view(self):
193194
d = Document.objects.get(title="GeoNode Map")
194195
self.assertEqual(d.doc_url, "http://www.geonode.org/map.pdf")
195196

197+
def test_uploaded_csv_with_uppercase_extension(self):
198+
"""
199+
The extension of the file should always be lowercase
200+
"""
201+
202+
self.client.login(username="admin", password="admin")
203+
try:
204+
with open(os.path.join(os.path.dirname(__file__), "tests/data/test.CSV"), "rb") as f:
205+
data = {"title": "CSV with uppercase extension", "doc_file": f, "extension": "CSV"}
206+
self.client.post(reverse("document_upload"), data=data)
207+
d = Document.objects.get(title="CSV with uppercase extension")
208+
# verify that the extension is not lowercase
209+
self.assertEqual(d.extension, "csv")
210+
# be sure that also the file extension is not lowercase
211+
asset = get_default_asset(d)
212+
self.assertEqual(Path(asset.location[0]).suffix, ".csv")
213+
finally:
214+
Document.objects.filter(title="CSV with uppercase extension").delete()
215+
196216
def test_upload_document_form(self):
197217
"""
198218
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/resource/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ def document_post_save(instance, *args, **kwargs):
333333
asset = get_default_asset(instance)
334334
if asset:
335335
_, extension = os.path.splitext(os.path.basename(asset.location[0]))
336-
instance.extension = extension[1:]
336+
instance.extension = extension[1:].lower()
337337
doc_type_map = DOCUMENT_TYPE_MAP
338338
doc_type_map.update(getattr(settings, "DOCUMENT_TYPE_MAP", {}))
339339
if doc_type_map is None:

0 commit comments

Comments
 (0)