Example #1
0
 def test_create_and_delete_favorites(self):
     """
     Ensure we can add and remove resources to user's favorite.
     """
     dataset = get_resources_with_perms(get_user_model().objects.get(pk=-1)).first()
     url = urljoin(f"{reverse('base-resources-list')}/", f"{dataset.pk}/favorite/")
     # Anonymous
     response = self.client.post(url, format='json')
     self.assertEqual(response.status_code, 403)
     # Authenticated user
     self.assertTrue(self.client.login(username='******', password='******'))
     response = self.client.post(url, format="json")
     self.assertEqual(response.data["message"], "Successfuly added resource to favorites")
     self.assertEqual(response.status_code, 201)
     # add resource to favorite again
     response = self.client.post(url, format="json")
     self.assertEqual(response.data["message"], "Resource is already in favorites")
     self.assertEqual(response.status_code, 400)
     # remove resource from favorites
     response = self.client.delete(url, format="json")
     self.assertEqual(response.data["message"], "Successfuly removed resource from favorites")
     self.assertEqual(response.status_code, 200)
     # remove resource to favorite again
     response = self.client.delete(url, format="json")
     self.assertEqual(response.data["message"], "Resource not in favorites")
     self.assertEqual(response.status_code, 404)
Example #2
0
    def resource_types(self, request):
        resource_types = []
        _types = []
        for _model in apps.get_models():
            if _model.__name__ == "ResourceBase":
                for _m in _model.__subclasses__():
                    if _m.__name__.lower() not in ['service']:
                        _types.append(_m.__name__.lower())

        if settings.GEONODE_APPS_ENABLE and 'geoapp' in _types:
            _types.remove('geoapp')
            if hasattr(settings, 'MAPSTORE_CLIENT_APP_LIST'
                       ) and settings.MAPSTORE_CLIENT_APP_LIST:
                _types += settings.MAPSTORE_CLIENT_APP_LIST
            else:
                from geonode.geoapps.models import GeoApp
                geoapp_types = [
                    x for x in GeoApp.objects.values_list(
                        'resource_type', flat=True).all().distinct()
                ]
                _types += geoapp_types

        for _type in _types:
            resource_types.append({
                "name":
                _type,
                "count":
                get_resources_with_perms(
                    request.user).filter(resource_type=_type).count()
            })
        return Response({"resource_types": resource_types})
Example #3
0
 def _filtered(self, request, filter):
     paginator = GeoNodeApiPagination()
     paginator.page_size = request.GET.get('page_size', 10)
     resources = get_resources_with_perms(request.user).filter(**filter)
     result_page = paginator.paginate_queryset(resources, request)
     serializer = ResourceBaseSerializer(result_page, embed=True, many=True)
     return paginator.get_paginated_response({"resources": serializer.data})
Example #4
0
 def to_representation(self, instance):
     request = self.context.get('request')
     filter_options = {}
     if request.query_params:
         filter_options = {
             'type_filter': request.query_params.get('type'),
             'title_filter': request.query_params.get('title__icontains')
         }
     data = super().to_representation(instance)
     count_filter = {self.Meta.count_type: instance}
     data['count'] = get_resources_with_perms(
         request.user, filter_options).filter(**count_filter).count()
     return data
Example #5
0
def _filtered(request, resources, serializer):
    try:
        paginator = GeoNodeApiPagination()
        paginator.page_size = request.GET.get('page_size', 10)
        user_resources = get_resources_with_perms(request.user)
        resources = resources.filter(id__in=user_resources)
        result_page = paginator.paginate_queryset(resources, request)
        resource_type_serializer = serializer(result_page,
                                              embed=True,
                                              many=True)
        return paginator.get_paginated_response(
            {"resources": resource_type_serializer.data})
    except Exception as e:
        return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR,
                        exception=e)
Example #6
0
 def get_queryset(self):
     """
     Filter users with atleast a resource
     """
     queryset = get_user_model().objects.all().exclude(pk=-1)
     filter_options = {}
     if self.request.query_params:
         filter_options = {
             'type_filter': self.request.query_params.get('type'),
             'title_filter': self.request.query_params.get('title__icontains')
         }
     queryset = queryset.filter(id__in=Subquery(
         get_resources_with_perms(self.request.user, filter_options).values('owner'))
     )
     return queryset
Example #7
0
    def filter_queryset(self, request, queryset, view):
        # We want to defer this import until runtime, rather than import-time.
        # See https://github.com/encode/django-rest-framework/issues/4608
        # (Also see #1624 for why we need to make this import explicitly)

        user = request.user
        # perm_format = '%(app_label)s.view_%(model_name)s'
        # permission = self.perm_format % {
        #     'app_label': queryset.model._meta.app_label,
        #     'model_name': queryset.model._meta.model_name,
        # }

        obj_with_perms = get_resources_with_perms(
            user, shortcut_kwargs=self.shortcut_kwargs)
        logger.debug(f" user: {user} -- obj_with_perms: {obj_with_perms}")

        return queryset.filter(id__in=obj_with_perms.values('id'))
Example #8
0
def resource_service_exists(request, uuid: str):
    """
    Returns a JSON boolean success field valorized with the 'exists' operation outcome.

    -  GET http://localhost:8000/api/v2/resource-service/exists/13decd74-df04-11eb-a0c1-00155dc3de71
       ```
        200,
        {
            'success': true
        }
       ```
    """
    _exists = False
    if resource_manager.exists(uuid):
        _exists = get_resources_with_perms(
            request.user).filter(uuid=uuid).exists()
    return Response({'success': _exists}, status=status.HTTP_200_OK)
Example #9
0
    def resource_types(self, request):
        resource_types = []
        _types = []
        for _model in apps.get_models():
            if _model.__name__ == "ResourceBase":
                for _m in _model.__subclasses__():
                    if _m.__name__.lower() not in ['geoapp', 'service']:
                        _types.append(_m.__name__.lower())

        if settings.GEONODE_APPS_ENABLE:
            _types.extend(get_geoapp_subtypes())

        for _type in _types:
            resource_types.append({
                "name": _type,
                "count": get_resources_with_perms(request.user).filter(resource_type=_type).count()
            })
        return Response({"resource_types": resource_types})
Example #10
0
 def to_representation(self, instance):
     request = self.context.get('request')
     filter_options = {}
     if request.query_params:
         filter_options = {
             'type_filter': request.query_params.get('type'),
             'title_filter': request.query_params.get('title__icontains')
         }
     data = super().to_representation(instance)
     if not isinstance(data, int):
         try:
             count_filter = {self.Meta.count_type: instance}
             data['count'] = get_resources_with_perms(
                 request.user,
                 filter_options).filter(**count_filter).count()
         except (TypeError, NoReverseMatch) as e:
             logger.exception(e)
     return data