Skip to content

Commit cde0707

Browse files
merge with master
2 parents 3a8cfbb + 9b1e147 commit cde0707

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+572
-168
lines changed

.env.sample

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ DEFAULT_FROM_EMAIL='{email}' # eg Company <[email protected]>
127127
# Session/Access Control
128128
LOCKDOWN_GEONODE=False
129129
X_FRAME_OPTIONS="SAMEORIGIN"
130+
SESSION_ENGINE=django.contrib.sessions.backends.cached_db
130131
SESSION_EXPIRED_CONTROL_ENABLED=True
131132
DEFAULT_ANONYMOUS_VIEW_PERMISSION=True
132133
DEFAULT_ANONYMOUS_DOWNLOAD_PERMISSION=True

geonode/base/api/permissions.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@
3535
from geonode.groups.models import GroupProfile
3636
from rest_framework.permissions import DjangoModelPermissions
3737
from guardian.shortcuts import get_objects_for_user
38-
from itertools import chain
39-
from guardian.shortcuts import get_groups_with_perms
38+
from geonode.security.registry import permissions_registry
4039

4140
logger = logging.getLogger(__name__)
4241

@@ -251,19 +250,10 @@ def has_permission(self, request, view):
251250
)
252251

253252
# getting the user permission for that resource
254-
resource_perms = res.get_user_perms(request.user)
255-
256-
groups = get_groups_with_perms(res, attach_perms=True)
257-
# we are making this because the request.user.groups sometimes returns empty si is not fully reliable
258-
for group, perm in groups.items():
259-
# checking if the user is in that group
260-
if group.user_set.filter(username=request.user).exists():
261-
resource_perms = list(chain(resource_perms, perm))
262-
263-
if request.user.has_perm("base.add_resourcebase"):
264-
resource_perms.append("add_resourcebase")
265-
# merging all available permissions into a single list
266-
available_perms = list(set(resource_perms))
253+
available_perms = permissions_registry.get_perms(
254+
instance=res, user=request.user, include_user_add_resource=True
255+
)
256+
267257
# fixup the permissions name
268258
perms_without_base = [x.replace("base.", "") for x in perms]
269259
# if at least one of the permissions is available the request is True

geonode/base/api/serializers.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
from geonode.security.utils import get_resources_with_perms, get_geoapp_subtypes
7070
from geonode.resource.models import ExecutionRequest
7171
from django.contrib.gis.geos import Polygon
72+
from geonode.security.registry import permissions_registry
7273

7374
logger = logging.getLogger(__name__)
7475

@@ -523,7 +524,11 @@ class Meta:
523524
def to_representation(self, instance):
524525
request = self.context.get("request", None)
525526
resource = ResourceBase.objects.get(pk=instance)
526-
return resource.get_user_perms(request.user) if request and request.user and resource else []
527+
return (
528+
permissions_registry.get_perms(instance=resource, user=request.user)
529+
if request and request.user and resource
530+
else []
531+
)
527532

528533

529534
class LinksSerializer(DynamicModelSerializer):

geonode/base/api/tests.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
)
9595
from geonode.resource.api.tasks import resouce_service_dispatcher
9696
from guardian.shortcuts import assign_perm
97+
from geonode.security.registry import permissions_registry
9798

9899
logger = logging.getLogger(__name__)
99100

@@ -2374,7 +2375,9 @@ def test_resource_service_copy_with_perms_dataset_set_default_perms(self):
23742375
}
23752376
resource.set_permissions(_perms)
23762377
# checking that bobby is in the original dataset perms list
2377-
self.assertTrue("bobby" in "bobby" in [x.username for x in resource.get_all_level_info().get("users", [])])
2378+
self.assertIn(
2379+
"bobby", [x.username for x in permissions_registry.get_perms(instance=resource).get("users", [])]
2380+
)
23782381
# copying the resource, should remove the perms for bobby
23792382
# only the default perms should be available
23802383
copy_url = reverse("importer_resource_copy", kwargs={"pk": resource.pk})
@@ -2389,8 +2392,14 @@ def test_resource_service_copy_with_perms_dataset_set_default_perms(self):
23892392
self.assertEqual("finished", self.client.get(response.json().get("status_url")).json().get("status"))
23902393
_resource = Dataset.objects.filter(title__icontains="test_copy_with_perms").last()
23912394
self.assertIsNotNone(_resource)
2392-
self.assertNotIn("bobby", [x.username for x in _resource.get_all_level_info().get("users", [])])
2393-
self.assertIn("admin", [x.username for x in _resource.get_all_level_info().get("users", [])])
2395+
self.assertNotIn(
2396+
"bobby",
2397+
[x.username for x in permissions_registry.get_perms(instance=_resource).get("users", [])],
2398+
)
2399+
self.assertIn(
2400+
"admin",
2401+
[x.username for x in permissions_registry.get_perms(instance=_resource).get("users", [])],
2402+
)
23942403

23952404
def test_resource_service_copy_with_perms_doc(self):
23962405
files = os.path.join(gisdata.GOOD_DATA, "vector/single_point.shp")
@@ -3428,7 +3437,7 @@ def test_simple_resourcebase_can_be_created_by_resourcemanager(self):
34283437
"groups": {anonymous_group: set(["view_resourcebase"])},
34293438
}
34303439

3431-
actual_perms = resource.get_all_level_info().copy()
3440+
actual_perms = permissions_registry.get_perms(instance=resource).copy()
34323441
self.assertIsNotNone(actual_perms)
34333442
self.assertTrue(self.user in actual_perms["users"].keys())
34343443
self.assertTrue(anonymous_group in actual_perms["groups"].keys())

geonode/base/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
from geonode.base.auth import get_or_create_token
5959
from geonode.security.views import _perms_info_json
6060

61+
from geonode.security.registry import permissions_registry
6162

6263
logger = logging.getLogger(__name__)
6364

@@ -415,8 +416,7 @@ def resourcebase_embed(request, resourcebaseid, template="base/base_edit.html"):
415416

416417
# Call this first in order to be sure "perms_list" is correct
417418
permissions_json = _perms_info_json(resourcebase_obj)
418-
419-
perms_list = resourcebase_obj.get_user_perms(request.user)
419+
perms_list = permissions_registry.get_perms(instance=resourcebase_obj, user=request.user)
420420

421421
group = None
422422
if resourcebase_obj.group:

geonode/context_processors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def resource_urls(request):
4646
STATIC_URL=settings.STATIC_URL,
4747
CATALOGUE_BASE_URL=default_catalogue_backend()["URL"],
4848
ACCOUNT_OPEN_SIGNUP=settings.ACCOUNT_OPEN_SIGNUP,
49+
ACCOUNT_OPEN_SOCIALSIGNUP=settings.ACCOUNT_OPEN_SOCIALSIGNUP,
4950
ACCOUNT_APPROVAL_REQUIRED=settings.ACCOUNT_APPROVAL_REQUIRED,
5051
VERSION=get_version(),
5152
SITE_NAME=site.name,

geonode/documents/forms.py

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

131131
if extension:
132-
cleaned_data["extension"] = extension.replace(".", "")
132+
cleaned_data["extension"] = extension.replace(".", "").lower()
133133

134134
return cleaned_data
135135

geonode/documents/tests.py

Lines changed: 24 additions & 3 deletions
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
@@ -41,7 +42,7 @@
4142

4243
from guardian.shortcuts import get_anonymous_user
4344

44-
from geonode.assets.utils import create_asset_and_link
45+
from geonode.assets.utils import create_asset_and_link, get_default_asset
4546
from geonode.maps.models import Map
4647
from geonode.compat import ensure_string
4748
from geonode.base.enumerations import SOURCE_TYPE_REMOTE
@@ -56,6 +57,7 @@
5657
from geonode.upload.api.exceptions import FileUploadLimitException
5758

5859
from .forms import DocumentCreateForm
60+
from geonode.security.registry import permissions_registry
5961

6062

6163
TEST_GIF = os.path.join(os.path.dirname(__file__), "tests/data/img.gif")
@@ -189,6 +191,25 @@ def test_create_document_url_view(self):
189191
d = Document.objects.get(title="GeoNode Map")
190192
self.assertEqual(d.doc_url, "http://www.geonode.org/map.pdf")
191193

194+
def test_uploaded_csv_with_uppercase_extension(self):
195+
"""
196+
The extension of the file should always be lowercase
197+
"""
198+
199+
self.client.login(username="admin", password="admin")
200+
try:
201+
with open(os.path.join(os.path.dirname(__file__), "tests/data/test.CSV"), "rb") as f:
202+
data = {"title": "CSV with uppercase extension", "doc_file": f, "extension": "CSV"}
203+
self.client.post(reverse("document_upload"), data=data)
204+
d = Document.objects.get(title="CSV with uppercase extension")
205+
# verify that the extension is not lowercase
206+
self.assertEqual(d.extension, "csv")
207+
# be sure that also the file extension is not lowercase
208+
asset = get_default_asset(d)
209+
self.assertEqual(Path(asset.location[0]).suffix, ".csv")
210+
finally:
211+
Document.objects.filter(title="CSV with uppercase extension").delete()
212+
192213
def test_upload_document_form(self):
193214
"""
194215
Tests the Upload form.
@@ -397,8 +418,8 @@ def test_set_document_permissions(self):
397418
self.assertFalse(self.anonymous_user.has_perm("view_resourcebase", document.get_self_resource()))
398419

399420
# Test that previous permissions for users other than ones specified in
400-
# the perm_spec (and the document owner) were removed
401-
current_perms = document.get_all_level_info()
421+
# the perm_spec (and the document owner) were
422+
current_perms = permissions_registry.get_perms(instance=document)
402423
self.assertEqual(len(current_perms["users"]), 1)
403424

404425
# Test that the User permissions specified in the perm_spec were
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
@@ -41,6 +41,8 @@
4141
from geonode.resource.manager import resource_manager
4242
from geonode.base import enumerations
4343

44+
from pathlib import Path
45+
4446
from .utils import get_download_response
4547

4648
from .models import Document
@@ -137,7 +139,8 @@ def form_valid(self, form):
137139
if file:
138140
tempdir = mkdtemp()
139141
dirname = os.path.basename(tempdir)
140-
filepath = storage_manager.save(f"{dirname}/{file.name}", file)
142+
name = Path(file.name)
143+
filepath = storage_manager.save(f"{dirname}/{name.stem}{name.suffix.lower()}", file)
141144
storage_path = storage_manager.path(filepath)
142145
self.object = resource_manager.create(
143146
None,

0 commit comments

Comments
 (0)