import json
import logging
import traceback
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import DetailView
from django.core.exceptions import PermissionDenied
from django.contrib.auth.mixins import PermissionRequiredMixin
from dynamic_rest.viewsets import DynamicModelViewSet
from dynamic_rest.filters import DynamicFilterBackend, DynamicSortingFilter
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from oauth2_provider.contrib.rest_framework import OAuth2Authentication
from geonode.base.api.pagination import GeoNodeApiPagination
from .models import Geocollection
from .serializers import GeocollectionSerializer
from .permissions import GeocollectionPermissionsFilter
logger = logging.getLogger(__name__)
class GeocollectionViewSet(DynamicModelViewSet):
"""
API endpoint that allows geocollections to be viewed or edited.
"""
authentication_classes = [SessionAuthentication, BasicAuthentication, OAuth2Authentication]
permission_classes = [IsAuthenticatedOrReadOnly, ]
filter_backends = [
DynamicFilterBackend, DynamicSortingFilter,
GeocollectionPermissionsFilter
]
queryset = Geocollection.objects.all()
serializer_class = GeocollectionSerializer
pagination_class = GeoNodeApiPagination
class GeocollectionDetail(PermissionRequiredMixin, DetailView):
model = Geocollection
def has_permission(self):
return self.request.user.has_perm('access_geocollection', self.get_object())
def geocollection_permissions(request, collection_slug):
geocollection = Geocollection.objects.get(slug=collection_slug)
user = request.user
if not user.is_superuser:
raise PermissionDenied
if request.method == 'GET':
return render(request, 'geocollections/geocollection_permissions.html', context={'object': geocollection})
elif request.method == 'POST':
success = True
message = "Permissions successfully updated!"
try:
perm_spec = json.loads(request.POST.get('perm_spec'))
logger.info(f" ---- setting perm_spec: {perm_spec}")
geocollection.set_permissions(perm_spec)
return HttpResponse(
json.dumps({'success': success, 'message': message}),
status=200,
content_type='text/plain'
)
except Exception as e:
traceback.print_exc()
logger.exception(e)
success = False
message = f"Error updating permissions :(... error: {e}"
return HttpResponse(
json.dumps({'success': success, 'message': message}),
status=500,
content_type='text/plain'
)