consolidate API code for core and plus, fix access/default change in sliceplus, shore up caller arguments in update
diff --git a/planetstack/apigen/api.template.py b/planetstack/apigen/api.template.py
index 7ba0fe3..b3438c0 100644
--- a/planetstack/apigen/api.template.py
+++ b/planetstack/apigen/api.template.py
@@ -11,6 +11,7 @@
from django.conf.urls import patterns, url
from rest_framework.exceptions import PermissionDenied as RestFrameworkPermissionDenied
from django.core.exceptions import PermissionDenied as DjangoPermissionDenied
+from xosapibase import XOSRetrieveUpdateDestroyAPIView, XOSListCreateAPIView
if hasattr(serializers, "ReadOnlyField"):
# rest_framework 3.x
@@ -152,117 +153,17 @@
{% endfor %}
-serializerLookUp = {
+serializerLookUp = {
{% for object in generator.all %}
{{ object.camel }}: {{ object.camel }}Serializer,
{% endfor %}
None: None,
}
-class PlanetStackRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
-
- # To handle fine-grained field permissions, we have to check can_update
- # the object has been updated but before it has been saved.
-
- def update(self, request, *args, **kwargs):
- partial = kwargs.pop('partial', False)
- self.object = self.get_object_or_none()
-
- serializer = self.get_serializer(self.object, data=request.DATA,
- files=request.FILES, partial=partial)
-
- if not serializer.is_valid():
- response = {"error": "validation",
- "specific_error": "not serializer.is_valid()",
- "reasons": serializer.errors}
- return Response(response, status=status.HTTP_400_BAD_REQUEST)
-
- try:
- self.pre_save(serializer.object)
- except ValidationError as err:
- # full_clean on model instance may be called in pre_save,
- # so we have to handle eventual errors.
- response = {"error": "validation",
- "specific_error": "ValidationError in pre_save",
- "reasons": err.message_dict}
- return Response(response, status=status.HTTP_400_BAD_REQUEST)
-
- if serializer.object is not None:
- if not serializer.object.can_update(request.user):
- return Response(status=status.HTTP_400_BAD_REQUEST)
-
- if self.object is None:
- raise Exception("Use the List API for creating objects")
-
- self.object = serializer.save(force_update=True)
- self.post_save(self.object, created=False)
- return Response(serializer.data, status=status.HTTP_200_OK)
-
- def destroy(self, request, *args, **kwargs):
- obj = self.get_object()
- if obj.can_update(request.user):
- return super(PlanetStackRetrieveUpdateDestroyAPIView, self).destroy(request, *args, **kwargs)
- else:
- return Response(status=status.HTTP_400_BAD_REQUEST)
-
- def handle_exception(self, exc):
- # REST API drops the string attached to Django's PermissionDenied
- # exception, and replaces it with a generic "Permission Denied"
- if isinstance(exc, DjangoPermissionDenied):
- response=Response({'detail': str(exc)}, status=status.HTTP_403_FORBIDDEN)
- response.exception=True
- return response
- else:
- return super(PlanetStackRetrieveUpdateDestroyAPIView, self).handle_exception(exc)
-
-class PlanetStackListCreateAPIView(generics.ListCreateAPIView):
- def handle_exception(self, exc):
- # REST API drops the string attached to Django's PermissionDenied
- # exception, and replaces it with a generic "Permission Denied"
- if isinstance(exc, DjangoPermissionDenied):
- response=Response({'detail': str(exc)}, status=status.HTTP_403_FORBIDDEN)
- response.exception=True
- return response
- else:
- return super(PlanetStackListCreateAPIView, self).handle_exception(exc)
-
- def create(self, request, *args, **kwargs):
- serializer = self.get_serializer(data=request.DATA, files=request.FILES)
- if not (serializer.is_valid()):
- response = {"error": "validation",
- "specific_error": "not serializer.is_valid()",
- "reasons": serializer.errors}
- return Response(response, status=status.HTTP_400_BAD_REQUEST)
-
- # now do XOS can_update permission checking
-
- obj = serializer.object
- obj.caller = request.user
- if not obj.can_update(request.user):
- response = {"error": "validation",
- "specific_error": "failed can_update",
- "reasons": []}
- return Response(response, status=status.HTTP_400_BAD_REQUEST)
-
- # stuff below is from generics.ListCreateAPIView
-
- if (hasattr(self, "pre_save")):
- # rest_framework 2.x
- self.pre_save(serializer.object)
- self.object = serializer.save(force_insert=True)
- self.post_save(self.object, created=True)
- else:
- # rest_framework 3.x
- self.perform_create(serializer)
-
- headers = self.get_success_headers(serializer.data)
- return Response(serializer.data, status=status.HTTP_201_CREATED,
- headers=headers)
-
# Based on core/views/*.py
{% for object in generator.all %}
-class {{ object.camel }}List(PlanetStackListCreateAPIView):
+class {{ object.camel }}List(XOSListCreateAPIView):
queryset = {{ object.camel }}.objects.select_related().all()
serializer_class = {{ object.camel }}Serializer
id_serializer_class = {{ object.camel }}IdSerializer
@@ -284,7 +185,7 @@
return {{ object.camel }}.select_by_user(self.request.user)
-class {{ object.camel }}Detail(PlanetStackRetrieveUpdateDestroyAPIView):
+class {{ object.camel }}Detail(XOSRetrieveUpdateDestroyAPIView):
queryset = {{ object.camel }}.objects.select_related().all()
serializer_class = {{ object.camel }}Serializer
id_serializer_class = {{ object.camel }}IdSerializer
@@ -303,8 +204,8 @@
raise RestFrameworkPermissionDenied("You must be authenticated in order to use this API")
return {{ object.camel }}.select_by_user(self.request.user)
- # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
+ # update() is handled by XOSRetrieveUpdateDestroyAPIView
- # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
+ # destroy() is handled by XOSRetrieveUpdateDestroyAPIView
{% endfor %}