Skip to content

Commit 81d9153

Browse files
github-actions[bot]marthamarealgiohappy
authored andcommitted
[Fixes GeoNode#10055] Modify Metadata form with permissions check (GeoNode#10057) (GeoNode#10076)
* -[Fixes GeoNode#10055] Modify Metadata form with permissions check * - check user in form * - update tests * - add tests Co-authored-by: Giovanni Allegri <[email protected]> Co-authored-by: NAGGINDA MARTHA <[email protected]> Co-authored-by: Giovanni Allegri <[email protected]>
1 parent a18c8b4 commit 81d9153

File tree

4 files changed

+64
-3
lines changed

4 files changed

+64
-3
lines changed

geonode/base/forms.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,9 @@ def __init__(self, *args, **kwargs):
484484
self.user = kwargs.pop('user', None)
485485
super().__init__(*args, **kwargs)
486486
self.fields['regions'].choices = get_tree_data()
487-
487+
self.can_change_perms = self.user and self.user.has_perm(
488+
'change_resourcebase_permissions', self.instance.get_self_resource()
489+
)
488490
if self.instance and self.instance.id and self.instance.metadata.exists():
489491
self.fields['extra_metadata'].initial = [x.metadata for x in self.instance.metadata.all()]
490492

@@ -501,6 +503,9 @@ def __init__(self, *args, **kwargs):
501503
'data-container': 'body',
502504
'data-html': 'true'})
503505

506+
if field in ['poc', 'owner'] and not self.can_change_perms:
507+
self.fields[field].disabled = True
508+
504509
def disable_keywords_widget_for_non_superuser(self, user):
505510
if settings.FREETEXT_KEYWORDS_READONLY and not user.is_superuser:
506511
self['keywords'].field.disabled = True

geonode/geoapps/tests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def test_resource_form_is_valid_extra_metadata(self):
136136
"date_type": "creation",
137137
"language": "eng",
138138
"extra_metadata": '[{"id": 1, "filter_header": "object", "field_name": "object", "field_label": "object", "field_value": "object"}]'
139-
})
139+
}, user=self.user)
140140
self.assertTrue(form.is_valid())
141141

142142
def test_geoapp_category_is_correctly_assigned_in_metadata_upload(self):

geonode/layers/tests.py

+56
Original file line numberDiff line numberDiff line change
@@ -1877,6 +1877,62 @@ def test_resource_form_is_invalid_extra_metadata_not_json_format(self):
18771877
expected = {"success": False, "errors": ["extra_metadata: The value provided for the Extra metadata field is not a valid JSON"]}
18781878
self.assertDictEqual(expected, response.json())
18791879

1880+
def test_change_owner_in_metadata(self):
1881+
try:
1882+
test_user = get_user_model().objects.create_user(
1883+
username='non_auth',
1884+
1885+
password='password')
1886+
norman = get_user_model().objects.get(username='norman')
1887+
dataset = Dataset.objects.first()
1888+
data = {
1889+
"resource-title": "geoapp_title",
1890+
"resource-date": "2022-01-24 16:38 pm",
1891+
"resource-date_type": "creation",
1892+
"resource-language": "eng",
1893+
'dataset_attribute_set-TOTAL_FORMS': 0,
1894+
'dataset_attribute_set-INITIAL_FORMS': 0
1895+
}
1896+
perm_spec = {
1897+
"users": {
1898+
"non_auth": [
1899+
'change_resourcebase_metadata',
1900+
'change_resourcebase',
1901+
],
1902+
"norman": [
1903+
'change_resourcebase_metadata',
1904+
'change_resourcebase_permissions'
1905+
],
1906+
}
1907+
}
1908+
self.assertTrue(dataset.set_permissions(perm_spec))
1909+
self.assertFalse(test_user.has_perm('change_resourcebase_permissions', dataset.get_self_resource()))
1910+
1911+
url = reverse("dataset_metadata", args=(dataset.alternate,))
1912+
# post as non-authorised user
1913+
self.client.login(username="non_auth", password="password")
1914+
data["resource-owner"] = test_user.id
1915+
response = self.client.post(url, data=data)
1916+
self.assertEqual(response.status_code, 200)
1917+
self.assertNotEqual(dataset.owner, test_user)
1918+
# post as admin
1919+
self.client.login(username="admin", password="admin")
1920+
response = self.client.post(url, data=data)
1921+
dataset.refresh_from_db()
1922+
self.assertEqual(response.status_code, 200)
1923+
self.assertEqual(dataset.owner, test_user)
1924+
# post as an authorised user
1925+
self.client.login(username="norman", password="norman")
1926+
self.assertTrue(norman.has_perm('change_resourcebase_permissions', dataset.get_self_resource()))
1927+
data["resource-owner"] = norman.id
1928+
response = self.client.post(url, data=data)
1929+
dataset.refresh_from_db()
1930+
self.assertEqual(response.status_code, 200)
1931+
self.assertEqual(dataset.owner, norman)
1932+
finally:
1933+
get_user_model().objects.filter(username='non_auth').delete
1934+
Dataset.objects.filter(name='dataset_name').delete()
1935+
18801936
@override_settings(EXTRA_METADATA_SCHEMA={"key": "value"})
18811937
def test_resource_form_is_invalid_extra_metadata_not_schema_in_settings(self):
18821938
self.client.login(username="admin", password="admin")

geonode/maps/tests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,7 @@ def test_resource_form_is_invalid_extra_metadata_invalids_schema_entry(self):
710710
self.assertIn(expected, response.json()['errors'][0])
711711

712712
def test_resource_form_is_valid_extra_metadata(self):
713-
form = self.sut(data={
713+
form = self.sut(user=self.user, data={
714714
"owner": self.map.owner.id,
715715
"title": "map_title",
716716
"date": "2022-01-24 16:38 pm",

0 commit comments

Comments
 (0)