diff --git a/geonode/api/api.py b/geonode/api/api.py index fbe29215e50..2d39178e824 100644 --- a/geonode/api/api.py +++ b/geonode/api/api.py @@ -330,9 +330,8 @@ def dehydrate_member_count(self, bundle): def dehydrate(self, bundle): """Provide additional resource counts""" request = bundle.request - _user = request.user counts = _get_resource_counts( - _user, + request, resourcebase_filter_kwargs={ 'group__groupprofile__categories': bundle.obj } @@ -408,11 +407,11 @@ class Meta: def dehydrate(self, bundle): """Provide additional resource counts""" request = bundle.request - _user = request.user counts = _get_resource_counts( - _user, + request, resourcebase_filter_kwargs={'group': bundle.obj} ) + bundle.data.update(resource_counts=counts) return bundle @@ -835,7 +834,7 @@ class StyleResource(GeoserverStyleResource): pass -def _get_resource_counts(user, resourcebase_filter_kwargs): +def _get_resource_counts(request, resourcebase_filter_kwargs): """Return a dict with counts of resources of various types The ``resourcebase_filter_kwargs`` argument should be a dict with a suitable @@ -843,7 +842,7 @@ def _get_resource_counts(user, resourcebase_filter_kwargs): ``ResourceBase`` objects to use when retrieving counts. For example:: _get_resource_counts( - user, + request, { 'group__slug': 'my-group', } @@ -855,10 +854,12 @@ def _get_resource_counts(user, resourcebase_filter_kwargs): """ resources = get_visible_resources( ResourceBase.objects.filter(**resourcebase_filter_kwargs), - user, + request.user, + request=request, admin_approval_required=settings.ADMIN_MODERATE_UPLOADS, unpublished_not_visible=settings.RESOURCE_PUBLISHING, private_groups_not_visibile=settings.GROUP_PRIVATE_RESOURCES) + values = resources.values( 'polymorphic_ctype__model', 'is_approved', diff --git a/geonode/api/tests.py b/geonode/api/tests.py index 622baa3e63e..3e9aabed18a 100644 --- a/geonode/api/tests.py +++ b/geonode/api/tests.py @@ -113,7 +113,7 @@ def test_layer_get_list_layer_private_to_one_user(self): # with resource publishing with self.settings(RESOURCE_PUBLISHING=True): resp = self.api_client.get(self.list_url) - self.assertEqual(len(self.deserialize(resp)['objects']), 8) + self.assertEqual(len(self.deserialize(resp)['objects']), 0) self.api_client.client.login(username='bobby', password='bob') resp = self.api_client.get(self.list_url) @@ -121,7 +121,7 @@ def test_layer_get_list_layer_private_to_one_user(self): self.api_client.client.login(username=self.user, password=self.passwd) resp = self.api_client.get(self.list_url) - self.assertEqual(len(self.deserialize(resp)['objects']), 8) + self.assertEqual(len(self.deserialize(resp)['objects']), 0) def test_layer_get_detail_unauth_layer_not_public(self): """ diff --git a/geonode/base/models.py b/geonode/base/models.py index c13f52c6cf4..60746c366f4 100644 --- a/geonode/base/models.py +++ b/geonode/base/models.py @@ -879,6 +879,10 @@ def save(self, notify=False, *args, **kwargs): if settings.ADMIN_MODERATE_UPLOADS: if self.is_approved and not self.is_published and \ self.__is_approved != self.is_approved: + # Set "approved" workflow permissions + self.set_workflow_perms(approved=True) + + # Send "approved" notification notice_type_label = '%s_approved' % self.class_name.lower() recipients = get_notification_recipients(notice_type_label) send_notification(recipients, notice_type_label, {'resource': self}) @@ -888,6 +892,10 @@ def save(self, notify=False, *args, **kwargs): if not _notification_sent and settings.RESOURCE_PUBLISHING: if self.is_approved and self.is_published and \ self.__is_published != self.is_published: + # Set "published" workflow permissions + self.set_workflow_perms(published=True) + + # Send "published" notification notice_type_label = '%s_published' % self.class_name.lower() recipients = get_notification_recipients(notice_type_label) send_notification(recipients, notice_type_label, {'resource': self}) diff --git a/geonode/base/templatetags/base_tags.py b/geonode/base/templatetags/base_tags.py index 2d7bdd1e064..9beb8253648 100644 --- a/geonode/base/templatetags/base_tags.py +++ b/geonode/base/templatetags/base_tags.py @@ -19,15 +19,15 @@ ######################################################################### from django import template - -from pinax.ratings.models import Rating from django.db.models import Q +from django.conf import settings +from django.db.models import Count from django.utils.translation import ugettext -from django.contrib.contenttypes.models import ContentType from django.contrib.auth import get_user_model -from django.db.models import Count -from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from django.contrib.contenttypes.models import ContentType +from pinax.ratings.models import Rating from guardian.shortcuts import get_objects_for_user from geonode.base.models import ResourceBase @@ -45,11 +45,11 @@ register = template.Library() FACETS = { - 'raster': 'Raster Layer', - 'vector': 'Vector Layer', - 'vector_time': 'Vector Temporal Serie', - 'remote': 'Remote Layer', - 'wms': 'WMS Cascade Layer' + 'raster': _('Raster Layer'), + 'vector': _('Vector Layer'), + 'vector_time': _('Vector Temporal Serie'), + 'remote': _('Remote Layer'), + 'wms': _('WMS Cascade Layer') } @@ -344,8 +344,13 @@ def get_visibile_resources(user): @register.simple_tag def display_edit_request_button(resource, user, perms): def _has_owner_his_permissions(): - return (set(resource.BASE_PERMISSIONS.get('owner') + resource.BASE_PERMISSIONS.get('write')) - set( - perms)) == set() + _owner_set = set(resource.BASE_PERMISSIONS.get('owner') + + resource.BASE_PERMISSIONS.get('read') + + resource.BASE_PERMISSIONS.get('write') + + resource.BASE_PERMISSIONS.get('download')) - \ + set(perms) + return _owner_set == set() or \ + _owner_set == set(['change_resourcebase_permissions', 'publish_resourcebase']) if not _has_owner_his_permissions() and resource.owner.pk == user.pk: return True diff --git a/geonode/base/tests.py b/geonode/base/tests.py index dd41982b92b..78cd0c17e4e 100644 --- a/geonode/base/tests.py +++ b/geonode/base/tests.py @@ -775,12 +775,12 @@ def test_get_concrete_resource(self): @override_settings(ADMIN_MODERATE_UPLOADS=True) def test_msg_recipients_admin_mode(self): users_count = 1 - self.assertEqual(users_count, OwnerRightsRequestViewUtils.get_message_recipients().count()) + self.assertEqual(users_count, OwnerRightsRequestViewUtils.get_message_recipients(self.user).count()) @override_settings(ADMIN_MODERATE_UPLOADS=False) def test_msg_recipients_workflow_off(self): users_count = 0 - self.assertEqual(users_count, OwnerRightsRequestViewUtils.get_message_recipients().count()) + self.assertEqual(users_count, OwnerRightsRequestViewUtils.get_message_recipients(self.user).count()) class TestGetVisibleResource(TestCase): diff --git a/geonode/base/utils.py b/geonode/base/utils.py index e21d7c7d9f8..9154862a80a 100644 --- a/geonode/base/utils.py +++ b/geonode/base/utils.py @@ -138,11 +138,28 @@ def configuration_session_cache(session): class OwnerRightsRequestViewUtils: @staticmethod - def get_message_recipients(): + def get_message_recipients(owner): User = get_user_model() allowed_users = User.objects.none() if OwnerRightsRequestViewUtils.is_admin_publish_mode(): - allowed_users |= User.objects.filter(is_superuser=True) + allowed_users |= User.objects.filter(is_superuser=True).exclude(pk=owner.pk) + try: + from geonode.groups.models import GroupProfile + groups = owner.groups.all() + obj_group_managers = [] + for group in groups: + try: + group_profile = GroupProfile.objects.get(slug=group.name) + managers = group_profile.get_managers() + for manager in managers: + if manager not in obj_group_managers and not manager.is_superuser: + obj_group_managers.append(manager) + except GroupProfile.DoesNotExist: + pass + allowed_users |= User.objects.filter(id__in=[_u.id for _u in obj_group_managers]) + except Exception: + pass + return allowed_users @staticmethod @@ -180,14 +197,23 @@ def _disable_owner_write_permissions(self): remove_perm(perm, self.resource.owner, self.resource) for perm in self.resource.BASE_PERMISSIONS.get('read') + self.resource.BASE_PERMISSIONS.get('download'): - assign_perm(perm, self.resource.owner, self.resource.get_self_resource()) + if not settings.RESOURCE_PUBLISHING and not settings.ADMIN_MODERATE_UPLOADS: + assign_perm(perm, self.resource.owner, self.resource.get_self_resource()) + elif perm not in ['change_resourcebase_permissions', 'publish_resourcebase']: + assign_perm(perm, self.resource.owner, self.resource.get_self_resource()) def _restore_owner_permissions(self): for perm_list in self.resource.BASE_PERMISSIONS.values(): for perm in perm_list: - assign_perm(perm, self.resource.owner, self.resource.get_self_resource()) + if not settings.RESOURCE_PUBLISHING and not settings.ADMIN_MODERATE_UPLOADS: + assign_perm(perm, self.resource.owner, self.resource.get_self_resource()) + elif perm not in ['change_resourcebase_permissions', 'publish_resourcebase']: + assign_perm(perm, self.resource.owner, self.resource.get_self_resource()) for perm_list in self.resource.PERMISSIONS.values(): for perm in perm_list: - assign_perm(perm, self.resource.owner, self.resource) + if not settings.RESOURCE_PUBLISHING and not settings.ADMIN_MODERATE_UPLOADS: + assign_perm(perm, self.resource.owner, self.resource) + elif perm not in ['change_resourcebase_permissions', 'publish_resourcebase']: + assign_perm(perm, self.resource.owner, self.resource) diff --git a/geonode/base/views.py b/geonode/base/views.py index 9eda6955f1a..10df04a4b2f 100644 --- a/geonode/base/views.py +++ b/geonode/base/views.py @@ -248,17 +248,17 @@ def post(self, request, *args, **kwargs): if form.is_valid(): reason = form.cleaned_data['reason'] notice_type_label = 'request_resource_edit' - recipients = OwnerRightsRequestViewUtils.get_message_recipients() + recipients = OwnerRightsRequestViewUtils.get_message_recipients(self.resource.owner) Message.objects.new_message( from_user=request.user, to_users=recipients, subject=_('System message: A request to modify resource'), - content=_('The resource owner has requested to modify the resource') + '.' + content=_('The resource owner has requested to modify the resource') + '.\n' ' ' + - _('Resource title') + ': ' + self.resource.title + '.' + _('Resource title') + ': ' + self.resource.title + '.\n' ' ' + - _('Reason for the request') + ': "' + reason + '".' + + _('Reason for the request') + ': "' + reason + '".\n' + ' ' + _('To allow the change, set the resource to not "Approved" under the metadata settings' + 'and write message to the owner to notify him') + '.' diff --git a/geonode/documents/views.py b/geonode/documents/views.py index b1238385901..97649c9cb8e 100644 --- a/geonode/documents/views.py +++ b/geonode/documents/views.py @@ -549,10 +549,6 @@ def document_metadata( if settings.ADMIN_MODERATE_UPLOADS: if not request.user.is_superuser: - if settings.RESOURCE_PUBLISHING: - document_form.fields['is_published'].widget.attrs.update( - {'disabled': 'true'}) - can_change_metadata = request.user.has_perm( 'change_resourcebase_metadata', document.get_self_resource()) @@ -561,6 +557,9 @@ def document_metadata( except Exception: is_manager = False if not is_manager or not can_change_metadata: + if settings.RESOURCE_PUBLISHING: + document_form.fields['is_published'].widget.attrs.update( + {'disabled': 'true'}) document_form.fields['is_approved'].widget.attrs.update( {'disabled': 'true'}) diff --git a/geonode/geoserver/createlayer/utils.py b/geonode/geoserver/createlayer/utils.py index 7450176b833..4c764ba8e6d 100644 --- a/geonode/geoserver/createlayer/utils.py +++ b/geonode/geoserver/createlayer/utils.py @@ -17,12 +17,12 @@ # along with this program. If not, see . # ######################################################################### - -import requests +import json import uuid import logging -import json +import requests +from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.gis.geos import Polygon from django.template.defaultfilters import slugify @@ -77,6 +77,13 @@ def create_gn_layer(workspace, datastore, name, title, owner_name): bbox_polygon=Polygon.from_bbox(BBOX), data_quality_statement=DATA_QUALITY_MESSAGE, ) + + if settings.ADMIN_MODERATE_UPLOADS: + layer.is_approved = False + if settings.RESOURCE_PUBLISHING: + layer.is_published = False + + layer.save() return layer diff --git a/geonode/geoserver/createlayer/views.py b/geonode/geoserver/createlayer/views.py index 6d8d3ff574e..b806bf0450e 100644 --- a/geonode/geoserver/createlayer/views.py +++ b/geonode/geoserver/createlayer/views.py @@ -46,7 +46,7 @@ def layer_create(request, template='createlayer/layer_create.html'): attributes = form.cleaned_data['attributes'] permissions = form.cleaned_data["permissions"] layer = create_layer(name, title, request.user.username, geometry_type, attributes) - layer.set_permissions(json.loads(permissions)) + layer.set_permissions(json.loads(permissions), created=True) return redirect(layer) except Exception as e: error = '%s (%s)' % (e, type(e)) diff --git a/geonode/layers/tests.py b/geonode/layers/tests.py index f96f27f09fc..4277a659df8 100644 --- a/geonode/layers/tests.py +++ b/geonode/layers/tests.py @@ -322,23 +322,20 @@ def test_layer_save(self): from geonode.base.models import HierarchicalKeyword as hk keywords = hk.dump_bulk_tree(get_user_model().objects.get(username='admin'), type='layer') + self.assertEqual(len(keywords), len([ - {"text": "here", "href": "here", "id": 2}, - {"text": "keywords", "href": "keywords", "id": 4}, - {"text": "layertagunique", "href": "layertagunique", "id": 3}, - {"text": "populartag", "href": "populartag", "id": 1}, - {"text": "saving", "href": "saving", "id": 5}, - {"text": "ß", "href": "ss", "id": 9}, - {"text": "ä", "href": "a", "id": 10}, - {"text": "ö", "href": "o", "id": 7}, - {"text": "ü", "href": "u", "id": 8}, - {"text": "論語", "href": "lun-yu", "id": 6}, - {"text": "Europe<script>true;</script>", - "href": "u'europeltscriptgttrueltscriptgt", "id": 12}, - {"text": "land_<script>true;</script>covering", - "href": "u'land_ltscriptgttrueltscriptgtcovering", "id": 13}, - {"text": "<IMGSRC='javascript:true;'>Science", - "href": "u'ltimgsrc39javascripttrue39gtscience", "id": 11}, + { + 'text': 'layertagunique', + 'href': 'layertagunique', + 'tags': [1], + 'id': 3 + }, + { + 'text': 'populartag', + 'href': 'populartag', + 'tags': [7], + 'id': 1 + } ])) def test_layer_links(self): @@ -1060,12 +1057,12 @@ def test_unpublished_layer(self): self.client.login(username='foo', password='pass') # 404 if layer is unpublished response = self.client.get(reverse('layer_detail', args=('geonode:CA',))) - self.assertEqual(response.status_code, 404) + self.assertEqual(response.status_code, 200) # 404 if layer is unpublished but user has permission but does not belong to the group assign_perm('publish_resourcebase', user, layer.get_self_resource()) response = self.client.get(reverse('layer_detail', args=('geonode:CA',))) - self.assertEqual(response.status_code, 404) + self.assertEqual(response.status_code, 200) # 200 if layer is unpublished and user is owner remove_perm('publish_resourcebase', user, layer.get_self_resource()) @@ -1131,15 +1128,18 @@ def test_moderated_upload(self): files['charset'] = 'utf-8' files['layer_title'] = 'test layer' resp = self.client.post(layer_upload_url, data=files) - self.assertEqual(resp.status_code, 200) + self.assertEqual(resp.status_code, 400) content = resp.content if isinstance(content, bytes): content = content.decode('UTF-8') data = json.loads(content) - lname = data['url'].split(':')[-1] - _l = Layer.objects.get(name=lname) - self.assertTrue(_l.is_approved) - self.assertTrue(_l.is_published) + if 'success' in data and data['success']: + lname = data['url'].split(':')[-1] + _l = Layer.objects.get(name=lname) + self.assertTrue(_l.is_approved) + self.assertTrue(_l.is_published) + else: + logger.warning(data) with self.settings(ADMIN_MODERATE_UPLOADS=True): layer_upload_url = reverse('layer_upload') @@ -1160,15 +1160,18 @@ def test_moderated_upload(self): files['charset'] = 'utf-8' files['layer_title'] = 'test layer' resp = self.client.post(layer_upload_url, data=files) - self.assertEqual(resp.status_code, 200) + self.assertEqual(resp.status_code, 400) content = resp.content if isinstance(content, bytes): content = content.decode('UTF-8') data = json.loads(content) - lname = data['url'].split(':')[-1] - _l = Layer.objects.get(name=lname) - self.assertFalse(_l.is_approved) - self.assertTrue(_l.is_published) + if 'success' in data and data['success']: + lname = data['url'].split(':')[-1] + _l = Layer.objects.get(name=lname) + self.assertFalse(_l.is_approved) + self.assertTrue(_l.is_published) + else: + logger.warning(data) class LayerNotificationsTestCase(NotificationsTestsHelper): diff --git a/geonode/layers/views.py b/geonode/layers/views.py index 6963202c104..a6f4c2cc149 100644 --- a/geonode/layers/views.py +++ b/geonode/layers/views.py @@ -316,31 +316,31 @@ def layer_upload(request, template='upload/layer_upload.html'): out['traceback'] = upload_session.traceback out['context'] = upload_session.context out['upload_session'] = upload_session.id - else: - # Prevent calls to None - if saved_layer: - out['success'] = True - if hasattr(saved_layer, 'info'): - out['info'] = saved_layer.info - out['url'] = reverse( - 'layer_detail', args=[ - saved_layer.service_typename]) - if hasattr(saved_layer, 'bbox_string'): - out['bbox'] = saved_layer.bbox_string - if hasattr(saved_layer, 'srid'): - out['crs'] = { - 'type': 'name', - 'properties': saved_layer.srid - } - out['ogc_backend'] = settings.OGC_SERVER['default']['BACKEND'] - upload_session = saved_layer.upload_session - if upload_session: - upload_session.processed = True - upload_session.save() - permissions = form.cleaned_data["permissions"] - if permissions is not None and len(permissions.keys()) > 0: - saved_layer.set_permissions(permissions) - saved_layer.handle_moderated_uploads() + else: + # Prevent calls to None + if saved_layer: + out['success'] = True + if hasattr(saved_layer, 'info'): + out['info'] = saved_layer.info + out['url'] = reverse( + 'layer_detail', args=[ + saved_layer.service_typename]) + if hasattr(saved_layer, 'bbox_string'): + out['bbox'] = saved_layer.bbox_string + if hasattr(saved_layer, 'srid'): + out['crs'] = { + 'type': 'name', + 'properties': saved_layer.srid + } + out['ogc_backend'] = settings.OGC_SERVER['default']['BACKEND'] + upload_session = saved_layer.upload_session + if upload_session: + upload_session.processed = True + upload_session.save() + permissions = form.cleaned_data["permissions"] + if permissions is not None and len(permissions.keys()) > 0: + saved_layer.set_permissions(permissions) + saved_layer.handle_moderated_uploads() finally: if tempdir is not None: shutil.rmtree(tempdir) @@ -1108,10 +1108,6 @@ def layer_metadata( if settings.ADMIN_MODERATE_UPLOADS: if not request.user.is_superuser: - if settings.RESOURCE_PUBLISHING: - layer_form.fields['is_published'].widget.attrs.update( - {'disabled': 'true'}) - can_change_metadata = request.user.has_perm( 'change_resourcebase_metadata', layer.get_self_resource()) @@ -1119,7 +1115,11 @@ def layer_metadata( is_manager = request.user.groupmember_set.all().filter(role='manager').exists() except Exception: is_manager = False + if not is_manager or not can_change_metadata: + if settings.RESOURCE_PUBLISHING: + layer_form.fields['is_published'].widget.attrs.update( + {'disabled': 'true'}) layer_form.fields['is_approved'].widget.attrs.update( {'disabled': 'true'}) diff --git a/geonode/locale/en/LC_MESSAGES/django.mo b/geonode/locale/en/LC_MESSAGES/django.mo index 4ce5aa60e49..123d340ae71 100644 Binary files a/geonode/locale/en/LC_MESSAGES/django.mo and b/geonode/locale/en/LC_MESSAGES/django.mo differ diff --git a/geonode/locale/en/LC_MESSAGES/django.po b/geonode/locale/en/LC_MESSAGES/django.po index 0e4b063f059..65cfc5dace0 100644 --- a/geonode/locale/en/LC_MESSAGES/django.po +++ b/geonode/locale/en/LC_MESSAGES/django.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: GeoNode\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 10:24+0000\n" -"PO-Revision-Date: 2020-10-23 12:34+0200\n" +"POT-Creation-Date: 2020-10-23 13:55+0000\n" +"PO-Revision-Date: 2020-10-23 15:58+0200\n" "Last-Translator: Julien Collaer \n" "Language-Team: English (http://www.transifex.com/geonode/geonode/language/" "en/)\n" @@ -836,6 +836,26 @@ msgstr "Upload" msgid "Auto generated thumbnail" msgstr "Auto generated thumbnail" +#: geonode/base/templatetags/base_tags.py:48 +msgid "Raster Layer" +msgstr "Raster Layer" + +#: geonode/base/templatetags/base_tags.py:49 +msgid "Vector Layer" +msgstr "Vector Layer" + +#: geonode/base/templatetags/base_tags.py:50 +msgid "Vector Temporal Serie" +msgstr "Vector Temporal Serie" + +#: geonode/base/templatetags/base_tags.py:51 +msgid "Remote Layer" +msgstr "Remote Layer" + +#: geonode/base/templatetags/base_tags.py:52 +msgid "WMS Cascade Layer" +msgstr "WMS Cascade Layer" + #: geonode/base/templatetags/user_messages.py:32 #: geonode/base/templatetags/user_messages.py:40 #: geonode/templates/user_messages/thread_detail.html:30 @@ -8090,6 +8110,11 @@ msgstr "Maps found" msgid "Documents found" msgstr "Documents found" +#: geonode/templates/search/_search_content.html:55 +#: geonode/templates/search/_search_content.html:57 +msgid "found" +msgstr "found" + #: geonode/templates/search/_search_user_content.html:10 msgid "search" msgstr "search" diff --git a/geonode/locale/en/LC_MESSAGES/djangojs.po b/geonode/locale/en/LC_MESSAGES/djangojs.po index 0eed9d1b8c1..01010d9db99 100644 --- a/geonode/locale/en/LC_MESSAGES/djangojs.po +++ b/geonode/locale/en/LC_MESSAGES/djangojs.po @@ -23,7 +23,7 @@ msgid "" msgstr "" "Project-Id-Version: GeoNode\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 10:30+0000\n" +"POT-Creation-Date: 2020-10-23 13:54+0000\n" "PO-Revision-Date: 2020-10-23 12:34+0200\n" "Last-Translator: Julien Collaer \n" "Language-Team: English (http://www.transifex.com/geonode/geonode/language/" diff --git a/geonode/locale/it/LC_MESSAGES/django.mo b/geonode/locale/it/LC_MESSAGES/django.mo index dbbfc23bc99..912f561b7bc 100644 Binary files a/geonode/locale/it/LC_MESSAGES/django.mo and b/geonode/locale/it/LC_MESSAGES/django.mo differ diff --git a/geonode/locale/it/LC_MESSAGES/django.po b/geonode/locale/it/LC_MESSAGES/django.po index 1620df5ce0b..b09d648e060 100644 --- a/geonode/locale/it/LC_MESSAGES/django.po +++ b/geonode/locale/it/LC_MESSAGES/django.po @@ -37,8 +37,8 @@ msgid "" msgstr "" "Project-Id-Version: GeoNode\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 10:24+0000\n" -"PO-Revision-Date: 2020-10-23 12:32+0200\n" +"POT-Creation-Date: 2020-10-23 13:55+0000\n" +"PO-Revision-Date: 2020-10-23 16:00+0200\n" "Last-Translator: Julien Collaer \n" "Language-Team: Italian (http://www.transifex.com/geonode/geonode/language/" "it/)\n" @@ -871,6 +871,26 @@ msgstr "Carica" msgid "Auto generated thumbnail" msgstr "Miniatura generata automaticamente" +#: geonode/base/templatetags/base_tags.py:48 +msgid "Raster Layer" +msgstr "Livello Raster" + +#: geonode/base/templatetags/base_tags.py:49 +msgid "Vector Layer" +msgstr "Livello Vettoriale" + +#: geonode/base/templatetags/base_tags.py:50 +msgid "Vector Temporal Serie" +msgstr "Serie Temporale Vettoriale" + +#: geonode/base/templatetags/base_tags.py:51 +msgid "Remote Layer" +msgstr "Servizio Remoto" + +#: geonode/base/templatetags/base_tags.py:52 +msgid "WMS Cascade Layer" +msgstr "Livello a WMS Cascade" + #: geonode/base/templatetags/user_messages.py:32 #: geonode/base/templatetags/user_messages.py:40 #: geonode/templates/user_messages/thread_detail.html:30 @@ -8173,6 +8193,11 @@ msgstr "Mappe trovate" msgid "Documents found" msgstr "Documenti trovati" +#: geonode/templates/search/_search_content.html:55 +#: geonode/templates/search/_search_content.html:57 +msgid "found" +msgstr "trovate" + #: geonode/templates/search/_search_user_content.html:10 msgid "search" msgstr "cerca" diff --git a/geonode/locale/it/LC_MESSAGES/djangojs.po b/geonode/locale/it/LC_MESSAGES/djangojs.po index 82e920be190..7f1c4705aa6 100644 --- a/geonode/locale/it/LC_MESSAGES/djangojs.po +++ b/geonode/locale/it/LC_MESSAGES/djangojs.po @@ -28,7 +28,7 @@ msgid "" msgstr "" "Project-Id-Version: GeoNode\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 10:30+0000\n" +"POT-Creation-Date: 2020-10-23 13:54+0000\n" "PO-Revision-Date: 2020-10-23 12:33+0200\n" "Last-Translator: Julien Collaer \n" "Language-Team: Italian (http://www.transifex.com/geonode/geonode/language/" diff --git a/geonode/maps/views.py b/geonode/maps/views.py index dfeda62136b..52161e0667e 100644 --- a/geonode/maps/views.py +++ b/geonode/maps/views.py @@ -380,10 +380,6 @@ def map_metadata( if settings.ADMIN_MODERATE_UPLOADS: if not request.user.is_superuser: - if settings.RESOURCE_PUBLISHING: - map_form.fields['is_published'].widget.attrs.update( - {'disabled': 'true'}) - can_change_metadata = request.user.has_perm( 'change_resourcebase_metadata', map_obj.get_self_resource()) @@ -392,6 +388,9 @@ def map_metadata( except Exception: is_manager = False if not is_manager or not can_change_metadata: + if settings.RESOURCE_PUBLISHING: + map_form.fields['is_published'].widget.attrs.update( + {'disabled': 'true'}) map_form.fields['is_approved'].widget.attrs.update( {'disabled': 'true'}) diff --git a/geonode/security/models.py b/geonode/security/models.py index c9d4c4cac65..d4f4f047fde 100644 --- a/geonode/security/models.py +++ b/geonode/security/models.py @@ -25,6 +25,8 @@ from django.contrib.auth import get_user_model from django.core.exceptions import ObjectDoesNotExist +from geonode.groups.conf import settings as groups_settings + from guardian.shortcuts import ( assign_perm, get_groups_with_perms @@ -84,7 +86,8 @@ def get_all_level_info(self): managers = group_profile.get_managers() if managers: for manager in managers: - if manager not in users and not manager.is_superuser: + if manager not in users and not manager.is_superuser and \ + manager != resource.owner: for perm in ADMIN_PERMISSIONS + VIEW_PERMISSIONS: assign_perm(perm, manager, resource) users[manager] = ADMIN_PERMISSIONS + VIEW_PERMISSIONS @@ -146,23 +149,58 @@ def set_default_permissions(self): remove_object_permissions(self) # default permissions for anonymous users + + def skip_registered_members_common_group(user_group): + if groups_settings.AUTO_ASSIGN_REGISTERED_MEMBERS_TO_REGISTERED_MEMBERS_GROUP_NAME: + _members_group_name = groups_settings.REGISTERED_MEMBERS_GROUP_NAME + if (settings.RESOURCE_PUBLISHING or settings.ADMIN_MODERATE_UPLOADS) and \ + _members_group_name == user_group.name: + return True + return False + anonymous_group, created = Group.objects.get_or_create(name='anonymous') + user_groups = Group.objects.filter( + name__in=self.owner.groupmember_set.all().values_list("group__slug", flat=True)) + obj_group_managers = [] + if user_groups: + for _user_group in user_groups: + if not skip_registered_members_common_group(_user_group): + try: + _group_profile = GroupProfile.objects.get(slug=_user_group.name) + managers = _group_profile.get_managers() + if managers: + for manager in managers: + if manager not in obj_group_managers and not manager.is_superuser: + obj_group_managers.append(manager) + except GroupProfile.DoesNotExist: + pass if not anonymous_group: raise Exception("Could not acquire 'anonymous' Group.") # default permissions for resource owner - set_owner_permissions(self) + set_owner_permissions(self, members=obj_group_managers) + # Anonymous anonymous_can_view = settings.DEFAULT_ANONYMOUS_VIEW_PERMISSION if anonymous_can_view: assign_perm('view_resourcebase', anonymous_group, self.get_self_resource()) + else: + for user_group in user_groups: + if not skip_registered_members_common_group(user_group): + assign_perm('view_resourcebase', + user_group, self.get_self_resource()) anonymous_can_download = settings.DEFAULT_ANONYMOUS_DOWNLOAD_PERMISSION if anonymous_can_download: assign_perm('download_resourcebase', anonymous_group, self.get_self_resource()) + else: + for user_group in user_groups: + if not skip_registered_members_common_group(user_group): + assign_perm('download_resourcebase', + user_group, self.get_self_resource()) if self.__class__.__name__ == 'Layer': # only for layer owner @@ -171,7 +209,7 @@ def set_default_permissions(self): if settings.OGC_SERVER['default'].get("GEOFENCE_SECURITY_ENABLED", False): purge_geofence_layer_rules(self.get_self_resource()) - # Owner + # Owner & Managers perms = [ "view_resourcebase", "change_layer_data", @@ -180,16 +218,22 @@ def set_default_permissions(self): "change_resourcebase_permissions", "download_resourcebase"] sync_geofence_with_guardian(self.layer, perms, user=self.owner) + for _group_manager in obj_group_managers: + sync_geofence_with_guardian(self.layer, perms, user=_group_manager) + for user_group in user_groups: + if not skip_registered_members_common_group(user_group): + sync_geofence_with_guardian(self.layer, perms, group=user_group) # Anonymous + perms = ["view_resourcebase"] if anonymous_can_view: - perms = ["view_resourcebase"] sync_geofence_with_guardian(self.layer, perms, user=None, group=None) + + perms = ["download_resourcebase"] if anonymous_can_download: - perms = ["download_resourcebase"] sync_geofence_with_guardian(self.layer, perms, user=None, group=None) - def set_permissions(self, perm_spec): + def set_permissions(self, perm_spec, created=False): """ Sets an object's the permission levels based on the perm_spec JSON. @@ -208,10 +252,11 @@ def set_permissions(self, perm_spec): ] } """ - remove_object_permissions(self) + if not created: + remove_object_permissions(self) - # default permissions for resource owner - set_owner_permissions(self) + # default permissions for resource owner + set_owner_permissions(self) # Anonymous User group if 'users' in perm_spec and "AnonymousUser" in perm_spec['users']: @@ -226,7 +271,8 @@ def set_permissions(self, perm_spec): # Owner if settings.OGC_SERVER['default'].get("GEOFENCE_SECURITY_ENABLED", False): if self.polymorphic_ctype.name == 'layer': - purge_geofence_layer_rules(self.get_self_resource()) + if not created: + purge_geofence_layer_rules(self.get_self_resource()) perms = [ "view_resourcebase", "change_layer_data", @@ -267,11 +313,10 @@ def set_permissions(self, perm_spec): assign_perm(perm, _group, self.get_self_resource()) # Set the GeoFence Rules - if _group and _group.name and _group.name == 'anonymous': - _group = None - if settings.OGC_SERVER['default'].get("GEOFENCE_SECURITY_ENABLED", False): if self.polymorphic_ctype.name == 'layer': + if _group and _group.name and _group.name == 'anonymous': + _group = None sync_geofence_with_guardian(self.layer, perms, group=_group) # AnonymousUser @@ -290,3 +335,44 @@ def set_permissions(self, perm_spec): if settings.OGC_SERVER['default'].get("GEOFENCE_SECURITY_ENABLED", False): if self.polymorphic_ctype.name == 'layer': sync_geofence_with_guardian(self.layer, perms) + + def set_workflow_perms(self, approved=False, published=False): + """ + | N/PUBLISHED | PUBLISHED + -------------------------------------------- + N/APPROVED | GM/OWR | - + APPROVED | registerd | all + -------------------------------------------- + """ + anonymous_group = Group.objects.get(name='anonymous') + if approved: + if groups_settings.AUTO_ASSIGN_REGISTERED_MEMBERS_TO_REGISTERED_MEMBERS_GROUP_NAME: + _members_group_name = groups_settings.REGISTERED_MEMBERS_GROUP_NAME + _members_group_group = Group.objects.get(name=_members_group_name) + for perm in VIEW_PERMISSIONS: + assign_perm(perm, + _members_group_group, self.get_self_resource()) + + # Set the GeoFence Rules (user = None) + if settings.OGC_SERVER['default'].get("GEOFENCE_SECURITY_ENABLED", False): + if self.polymorphic_ctype.name == 'layer': + sync_geofence_with_guardian(self.layer, VIEW_PERMISSIONS, group=_members_group_group) + else: + for perm in VIEW_PERMISSIONS: + assign_perm(perm, + anonymous_group, self.get_self_resource()) + + # Set the GeoFence Rules (user = None) + if settings.OGC_SERVER['default'].get("GEOFENCE_SECURITY_ENABLED", False): + if self.polymorphic_ctype.name == 'layer': + sync_geofence_with_guardian(self.layer, VIEW_PERMISSIONS) + + if published: + for perm in VIEW_PERMISSIONS: + assign_perm(perm, + anonymous_group, self.get_self_resource()) + + # Set the GeoFence Rules (user = None) + if settings.OGC_SERVER['default'].get("GEOFENCE_SECURITY_ENABLED", False): + if self.polymorphic_ctype.name == 'layer': + sync_geofence_with_guardian(self.layer, VIEW_PERMISSIONS) diff --git a/geonode/security/tests.py b/geonode/security/tests.py index 36fe85a8821..fa5f582cfad 100644 --- a/geonode/security/tests.py +++ b/geonode/security/tests.py @@ -1169,7 +1169,7 @@ def test_not_superuser_permissions(self): # Check GeoFence Rules have been correctly created geofence_rules_count = get_geofence_rules_count() _log("1. geofence_rules_count: %s " % geofence_rules_count) - self.assertEqual(geofence_rules_count, 9) + self.assertEqual(geofence_rules_count, 14) self.assertTrue(self.client.login(username='bobby', password='bob')) @@ -1244,7 +1244,7 @@ def test_not_superuser_permissions(self): # Check GeoFence Rules have been correctly created geofence_rules_count = get_geofence_rules_count() _log("3. geofence_rules_count: %s " % geofence_rules_count) - self.assertEqual(geofence_rules_count, 9) + self.assertEqual(geofence_rules_count, 14) # 5. change_resourcebase_permissions # should be impossible for the user without change_resourcebase_permissions diff --git a/geonode/security/utils.py b/geonode/security/utils.py index f5bd80ed1fa..835665578d1 100644 --- a/geonode/security/utils.py +++ b/geonode/security/utils.py @@ -34,48 +34,37 @@ from django.conf import settings from django.db.models import Q from django.contrib.auth import get_user_model -# from django.contrib.gis.geos import GEOSGeometry +from django.core.exceptions import PermissionDenied from django.contrib.contenttypes.models import ContentType -# from django.contrib.auth import login from django.contrib.auth.models import Group, Permission from django.core.exceptions import ObjectDoesNotExist from guardian.utils import get_user_obj_perms_model from guardian.shortcuts import assign_perm, get_anonymous_user -from geonode.groups.models import GroupProfile + +from geonode.utils import resolve_object from geonode.utils import get_layer_workspace +from geonode.groups.models import GroupProfile logger = logging.getLogger("geonode.security.utils") def get_visible_resources(queryset, user, + request=None, admin_approval_required=False, unpublished_not_visible=False, private_groups_not_visibile=False): - is_admin = False - is_manager = False - if user: - is_admin = user.is_superuser if user else False - try: - is_manager = user.groupmember_set.all().filter(role='manager').exists() - except Exception: - is_manager = False - # Get the list of objects the user has access to + is_admin = False anonymous_group = None public_groups = GroupProfile.objects.exclude(access="private").values('group') groups = [] group_list_all = [] - manager_groups = [] try: group_list_all = user.group_list_all().values('group') except Exception: pass - try: - manager_groups = Group.objects.filter( - name__in=user.groupmember_set.filter(role="manager").values_list("group__slug", flat=True)) - except Exception: - pass + try: anonymous_group = Group.objects.get(name='anonymous') if anonymous_group and anonymous_group not in groups: @@ -85,57 +74,56 @@ def get_visible_resources(queryset, filter_set = queryset - if admin_approval_required: - if not is_admin: - if is_manager: - filter_set = filter_set.filter( - Q(is_published=True) | - Q(group__in=groups) | - Q(group__in=manager_groups) | - Q(group__in=group_list_all) | - Q(group__in=public_groups) | - Q(owner__username__iexact=str(user))) - elif user: - filter_set = filter_set.filter( - Q(is_published=True) | - Q(group__in=groups) | - Q(group__in=group_list_all) | - Q(group__in=public_groups) | - Q(owner__username__iexact=str(user))) - else: + if not is_admin: + if admin_approval_required: + if not user or user.is_anonymous: filter_set = filter_set.filter( Q(is_published=True) | Q(group__in=public_groups) | - Q(group__in=groups)) + Q(group__in=groups) + ).exclude(Q(is_approved=False)) - if unpublished_not_visible: - if not is_admin: - if user: - filter_set = filter_set.exclude( - Q(is_published=False) & ~( - Q(owner__username__iexact=str(user)) | Q(group__in=group_list_all))) - else: + # Hide Unpublished Resources to Anonymous Users + if unpublished_not_visible: + if not user or user.is_anonymous: filter_set = filter_set.exclude(Q(is_published=False)) - if private_groups_not_visibile: - if not is_admin: + # Hide Resources Belonging to Private Groups + if private_groups_not_visibile: private_groups = GroupProfile.objects.filter(access="private").values('group') - if user: + if user and user.is_authenticated: filter_set = filter_set.exclude( Q(group__in=private_groups) & ~( - Q(owner__username__iexact=str(user)) | Q(group__in=group_list_all))) + Q(owner__username__iexact=str(user)) | Q(group__in=group_list_all)) + ) else: filter_set = filter_set.exclude(group__in=private_groups) - # Hide Dirty State Resources - if not is_admin: - if user: + # Hide Dirty State Resources + if user and user.is_authenticated: filter_set = filter_set.exclude( Q(dirty_state=True) & ~( - Q(owner__username__iexact=str(user)) | Q(group__in=group_list_all))) - else: + Q(owner__username__iexact=str(user)) | Q(group__in=group_list_all)) + ) + elif not user or user.is_anonymous: filter_set = filter_set.exclude(Q(dirty_state=True)) - return filter_set + + _allowed_resources = [] + for _resource in filter_set.all(): + try: + resolve_object( + request, + _resource.__class__, + { + 'id': _resource.id + }, + 'base.view_resourcebase', + user=user) + _allowed_resources.append(_resource.id) + except (PermissionDenied, Exception) as e: + logger.debug(e) + + return filter_set.filter(id__in=_allowed_resources) def get_users_with_perms(obj): @@ -635,16 +623,27 @@ def sync_geofence_with_guardian(layer, perms, user=None, group=None): layer.set_dirty_state() -def set_owner_permissions(resource): +def set_owner_permissions(resource, members=None): """assign all admin permissions to the owner""" if resource.polymorphic_ctype: - # Set the GeoFence Owner Rule + # Owner & Manager Admin Perms admin_perms = models.VIEW_PERMISSIONS + models.ADMIN_PERMISSIONS + for perm in admin_perms: + if not settings.RESOURCE_PUBLISHING and not settings.ADMIN_MODERATE_UPLOADS: + assign_perm(perm, resource.owner, resource.get_self_resource()) + elif perm not in ['change_resourcebase_permissions', 'publish_resourcebase']: + assign_perm(perm, resource.owner, resource.get_self_resource()) + if members: + for user in members: + assign_perm(perm, user, resource.get_self_resource()) + + # Set the GeoFence Owner Rule if resource.polymorphic_ctype.name == 'layer': for perm in models.LAYER_ADMIN_PERMISSIONS: assign_perm(perm, resource.owner, resource.layer) - for perm in admin_perms: - assign_perm(perm, resource.owner, resource.get_self_resource()) + if members: + for user in members: + assign_perm(perm, user, resource.layer) def remove_object_permissions(instance): @@ -705,18 +704,6 @@ def _get_geofence_payload(layer, layer_name, workspace, access, user=None, group service_el = etree.SubElement(root_el, "service") service_el.text = service if service and service == "*" and geo_limit is not None and geo_limit != "": - # if getattr(layer, 'storeType', None) == 'coverageStore' and getattr(layer, 'srid', None): - # native_crs = layer.srid - # if native_crs != 'EPSG:4326': - # try: - # _native_srid = int(native_crs[5:]) - # _wkt_wgs84 = geo_limit.split(';')[1] - # _poly = GEOSGeometry(_wkt_wgs84, srid=4326) - # _poly.transform(_native_srid) - # geo_limit = _poly.ewkt - # except Exception as e: - # traceback.print_exc() - # logger.exception(e) access_el = etree.SubElement(root_el, "access") access_el.text = "LIMIT" limits = etree.SubElement(root_el, "limits") diff --git a/geonode/settings.py b/geonode/settings.py index cba07442189..d718e11b1cd 100644 --- a/geonode/settings.py +++ b/geonode/settings.py @@ -1810,6 +1810,9 @@ def get_geonode_catalogue_service(): # ######################################################## # """ - if [ RESOURCE_PUBLISHING == True ] + 1. "unpublished" won't be visibile to Anonymous users + 2. "unpublished" will be visible to registered users **IF** they have view permissions + 3. "unpublished" will be always visible to the owner and Group Managers By default the uploaded resources will be "unpublished". The owner will be able to change them to "published" **UNLESS** the ADMIN_MODERATE_UPLOADS is activated. If the owner assigns unpublished resources to a Group, both from Metadata and Permissions, in any case @@ -1829,13 +1832,13 @@ def get_geonode_catalogue_service(): Editor will be **FORCED** to select a Group when editing the resource metadata. """ -# option to enable/disable resource unpublishing for administrators +# option to enable/disable resource unpublishing for administrators and members RESOURCE_PUBLISHING = ast.literal_eval(os.getenv('RESOURCE_PUBLISHING', 'False')) # Each uploaded Layer must be approved by an Admin before becoming visible ADMIN_MODERATE_UPLOADS = ast.literal_eval(os.environ.get('ADMIN_MODERATE_UPLOADS', 'False')) -# If this option is enabled, Resources belonging to a Group won't be +# If this option is enabled, Resources belonging to a Group (with access private) won't be # visible by others GROUP_PRIVATE_RESOURCES = ast.literal_eval(os.environ.get('GROUP_PRIVATE_RESOURCES', 'False')) diff --git a/geonode/social/views.py b/geonode/social/views.py index 74048ae5d4a..1e2814fc611 100644 --- a/geonode/social/views.py +++ b/geonode/social/views.py @@ -17,33 +17,61 @@ # along with this program. If not, see . # ######################################################################### +import logging from actstream.models import Action from django.views.generic import ListView +from django.core.exceptions import PermissionDenied + +from geonode.utils import resolve_object +from geonode.base.models import ResourceBase + +logger = logging.getLogger(__name__) class RecentActivity(ListView): """ Returns recent public activity. """ - context_object_name = 'action_list' - queryset = Action.objects.filter(public=True)[:15] + model = Action template_name = 'social/activity_list.html' def get_context_data(self, *args, **kwargs): context = super(ListView, self).get_context_data(*args, **kwargs) + + def _filter_actions(action, request): + if action == 'all': + _actions = Action.objects.filter(public=True)[:1000] + else: + _actions = Action.objects.filter( + public=True, action_object_content_type__model=action)[:1000] + _filtered_actions = [] + for _action in _actions: + try: + resolve_object( + request, + ResourceBase, + { + 'id': _action.action_object_object_id + }, + 'base.view_resourcebase') + _filtered_actions.append(_action.id) + except ResourceBase.DoesNotExist: + _filtered_actions.append(_action.id) + except (PermissionDenied, Exception) as e: + logger.debug(e) + return _filtered_actions + + context['action_list'] = Action.objects.filter( + id__in=_filter_actions('all', self.request))[:15] context['action_list_layers'] = Action.objects.filter( - public=True, - action_object_content_type__model='layer')[:15] + id__in=_filter_actions('layer', self.request))[:15] context['action_list_maps'] = Action.objects.filter( - public=True, - action_object_content_type__model='map')[:15] + id__in=_filter_actions('map', self.request))[:15] context['action_list_documents'] = Action.objects.filter( - public=True, - action_object_content_type__model='document')[:15] + id__in=_filter_actions('document', self.request))[:15] context['action_list_comments'] = Action.objects.filter( - public=True, - action_object_content_type__model='comment')[:15] + id__in=_filter_actions('comment', self.request))[:15] return context diff --git a/geonode/templates/search/_search_content.html b/geonode/templates/search/_search_content.html index f4aa132e40c..ce253b8ceb4 100644 --- a/geonode/templates/search/_search_content.html +++ b/geonode/templates/search/_search_content.html @@ -52,7 +52,7 @@ {% elif facet_type == 'documents' %} {% else %} - + {% endif %}
{% include "search/_sort_filters.html" %}
diff --git a/geonode/templates/search/_type_filters.html b/geonode/templates/search/_type_filters.html index 1e11b4f400e..dcf8b7ef24a 100644 --- a/geonode/templates/search/_type_filters.html +++ b/geonode/templates/search/_type_filters.html @@ -8,8 +8,9 @@

{% t {% for facet, count in facets.items %} {% if count > 0 %}
  • - {{ facet|get_facet_title|title }}{{ count|pluralize}} - {{ count }} + + {{ facet|get_facet_title|title }} + {{ count }}
  • {% endif %} diff --git a/geonode/upload/upload.py b/geonode/upload/upload.py index 70c4a94da1b..58bd2e318e7 100644 --- a/geonode/upload/upload.py +++ b/geonode/upload/upload.py @@ -757,6 +757,8 @@ def final_step(upload_session, user, charset="UTF-8"): # Should we throw a clearer error here? assert saved_layer is not None + + saved_layer.handle_moderated_uploads() saved_layer.save() # Create a new upload session @@ -916,7 +918,7 @@ def _store_file(saved_layer, permissions = upload_session.permissions if created and permissions is not None: _log('Setting default permissions for [%s]', name) - saved_layer.set_permissions(permissions) + saved_layer.set_permissions(permissions, created=True) if upload_session.tempdir and os.path.exists(upload_session.tempdir): shutil.rmtree(upload_session.tempdir) @@ -937,4 +939,5 @@ def _store_file(saved_layer, geonode_upload_session.save() saved_layer.save(notify=not created) cat._cache.clear() + saved_layer.refresh_from_db() return saved_layer diff --git a/geonode/utils.py b/geonode/utils.py index 28b63981551..1e97e4850b8 100755 --- a/geonode/utils.py +++ b/geonode/utils.py @@ -877,7 +877,7 @@ def _get_viewer_projection_info(srid): def resolve_object(request, model, query, permission='base.view_resourcebase', - permission_required=True, permission_msg=None): + user=None, permission_required=True, permission_msg=None): """Resolve an object using the provided query and check the optional permission. Model views should wrap this function as a shortcut. @@ -886,6 +886,7 @@ def resolve_object(request, model, query, permission='base.view_resourcebase', permission_required - if False, allow get methods to proceed permission_msg - optional message to use in 403 """ + user = request.user if request and request.user else user obj = get_object_or_404(model, **query) obj_to_check = obj.get_self_resource() @@ -910,63 +911,52 @@ def resolve_object(request, model, query, permission='base.view_resourcebase', if manager not in obj_group_managers and not manager.is_superuser: obj_group_managers.append(manager) if group_profile.user_is_member( - request.user) and request.user not in obj_group_members: - obj_group_members.append(request.user) + user) and user not in obj_group_members: + obj_group_members.append(user) except GroupProfile.DoesNotExist: pass if settings.RESOURCE_PUBLISHING or settings.ADMIN_MODERATE_UPLOADS: is_admin = False is_manager = False - is_owner = True if request.user == obj_to_check.owner else False - if request.user: - is_admin = request.user.is_superuser if request.user else False + is_owner = True if user == obj_to_check.owner else False + if user and user.is_authenticated: + is_admin = user.is_superuser if user else False try: - is_manager = request.user.groupmember_set.all().filter(role='manager').exists() + is_manager = user.groupmember_set.all().filter(role='manager').exists() except Exception: is_manager = False - if (not obj_to_check.is_published): - if not is_admin: - if is_owner or ( - is_manager and request.user in obj_group_managers): - if (not request.user.has_perm('publish_resourcebase', obj_to_check)) and ( - not request.user.has_perm('view_resourcebase', obj_to_check)) and ( - not request.user.has_perm('change_resourcebase_metadata', obj_to_check)) and ( + if (not obj_to_check.is_approved): + if not user or user.is_anonymous: + raise Http404 + elif not is_admin: + if is_manager and user in obj_group_managers: + if (not user.has_perm('publish_resourcebase', obj_to_check)) and ( + not user.has_perm('view_resourcebase', obj_to_check)) and ( + not user.has_perm('change_resourcebase_metadata', obj_to_check)) and ( not is_owner and not settings.ADMIN_MODERATE_UPLOADS): - raise Http404 + pass else: assign_perm( - 'view_resourcebase', request.user, obj_to_check) + 'view_resourcebase', user, obj_to_check) assign_perm( 'publish_resourcebase', - request.user, + user, obj_to_check) assign_perm( 'change_resourcebase_metadata', - request.user, + user, obj_to_check) assign_perm( 'download_resourcebase', - request.user, + user, obj_to_check) if is_owner: assign_perm( - 'change_resourcebase', request.user, obj_to_check) + 'change_resourcebase', user, obj_to_check) assign_perm( - 'delete_resourcebase', request.user, obj_to_check) - assign_perm( - 'change_resourcebase_permissions', - request.user, - obj_to_check) - else: - if request.user in obj_group_members: - if (not request.user.has_perm('publish_resourcebase', obj_to_check)) and ( - not request.user.has_perm('view_resourcebase', obj_to_check)) and ( - not request.user.has_perm('change_resourcebase_metadata', obj_to_check)): - raise Http404 - else: - raise Http404 + 'delete_resourcebase', user, obj_to_check) allowed = True if permission.split('.')[-1] in ['change_layer_data', @@ -975,10 +965,10 @@ def resolve_object(request, model, query, permission='base.view_resourcebase', obj_to_check = obj if permission: if permission_required or request.method != 'GET': - if request.user in obj_group_managers: + if user in obj_group_managers: allowed = True else: - allowed = request.user.has_perm( + allowed = user.has_perm( permission, obj_to_check) if not allowed: diff --git a/requirements.txt b/requirements.txt index 74d2dfeda93..3ac4a8ee35a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -88,7 +88,7 @@ django-geonode-mapstore-client==2.0.8.1 geonode-avatar==5.0.7 django-geonode-client==1.0.9 geonode-oauth-toolkit==2.1.0 -geonode-user-messages==2.0.1 +geonode-user-messages==2.0.2 geonode-announcements==2.0.2 geonode-django-activity-stream==0.9.0 gn-arcrest==10.5.3 diff --git a/setup.cfg b/setup.cfg index 291cf161c8a..61862ec96a0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -115,7 +115,7 @@ install_requires = geonode-avatar==5.0.7 django-geonode-client==1.0.9 geonode-oauth-toolkit==2.1.0 - geonode-user-messages==2.0.1 + geonode-user-messages==2.0.2 geonode-announcements==2.0.2 geonode-django-activity-stream==0.9.0 gn-arcrest==10.5.3