+ Router: RouterSerializer,
+
+ ServiceResource: ServiceResourceSerializer,
+
+ 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):\r
+ partial = kwargs.pop('partial', False)\r
+ self.object = self.get_object_or_none()\r
+\r
+ serializer = self.get_serializer(self.object, data=request.DATA,\r
+ files=request.FILES, partial=partial)\r
+\r
+ if not serializer.is_valid():\r
+ response = {"error": "validation",\r
+ "specific_error": "not serializer.is_valid()",\r
+ "reasons": serializer.errors}\r
+ return Response(response, status=status.HTTP_400_BAD_REQUEST)\r
+\r
+ try:\r
+ self.pre_save(serializer.object)\r
+ except ValidationError as err:\r
+ # full_clean on model instance may be called in pre_save,\r
+ # so we have to handle eventual errors.\r
+ response = {"error": "validation",\r
+ "specific_error": "ValidationError in pre_save",\r
+ "reasons": err.message_dict}\r
+ return Response(response, status=status.HTTP_400_BAD_REQUEST)\r
+\r
+ if serializer.object is not None:\r
+ if not serializer.object.can_update(request.user):\r
+ return Response(status=status.HTTP_400_BAD_REQUEST)\r
+\r
+ if self.object is None:\r
+ self.object = serializer.save(force_insert=True)\r
+ self.post_save(self.object, created=True)\r
+ return Response(serializer.data, status=status.HTTP_201_CREATED)\r
+\r
+ self.object = serializer.save(force_update=True)\r
+ self.post_save(self.object, created=False)\r
+ 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(generics.RetrieveUpdateDestroyAPIView, self).destroy(request, *args, **kwargs)
+ else:
+ return Response(status=status.HTTP_400_BAD_REQUEST)
+
+
+# Based on core/views/*.py
+
+
+class ServiceAttributeList(generics.ListCreateAPIView):
+ queryset = ServiceAttribute.objects.select_related().all()
+ serializer_class = ServiceAttributeSerializer
+ id_serializer_class = ServiceAttributeIdSerializer
+ filter_backends = (filters.DjangoFilterBackend,)
+ filter_fields = ('id','created','updated','enacted','backend_status','deleted','name','value','service',)
+
+ def get_serializer_class(self):
+ no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+ if (no_hyperlinks):
+ return self.id_serializer_class
+ else:
+ return self.serializer_class
+
+ def get_queryset(self):
+ return ServiceAttribute.select_by_user(self.request.user)
+
+ 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()",\r
+ "reasons": serializer.errors}\r
+ return Response(response, status=status.HTTP_400_BAD_REQUEST)
+ obj = serializer.object
+ obj.caller = request.user
+ if obj.can_update(request.user):
+ return super(ServiceAttributeList, self).create(request, *args, **kwargs)
+ else:
+ raise Exception("failed obj.can_update")
+
+ ret = super(ServiceAttributeList, self).create(request, *args, **kwargs)
+ if (ret.status_code%100 != 200):
+ raise Exception(ret.data)
+
+ return ret
+
+
+class ServiceAttributeDetail(PlanetStackRetrieveUpdateDestroyAPIView):
+ queryset = ServiceAttribute.objects.select_related().all()
+ serializer_class = ServiceAttributeSerializer
+ id_serializer_class = ServiceAttributeIdSerializer
+
+ def get_serializer_class(self):
+ no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+ if (no_hyperlinks):
+ return self.id_serializer_class
+ else:
+ return self.serializer_class
+
+ def get_queryset(self):
+ return ServiceAttribute.select_by_user(self.request.user)
+
+ # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
+
+ # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
+
+
+
+class ControllerImagesList(generics.ListCreateAPIView):
+ queryset = ControllerImages.objects.select_related().all()
+ serializer_class = ControllerImagesSerializer
+ id_serializer_class = ControllerImagesIdSerializer
+ filter_backends = (filters.DjangoFilterBackend,)
+ filter_fields = ('id','created','updated','enacted','backend_status','deleted','image','controller','glance_image_id',)
+
+ def get_serializer_class(self):
+ no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
+ if (no_hyperlinks):
+ return self.id_serializer_class
+ else:
+ return self.serializer_class
+
+ def get_queryset(self):
+ return ControllerImages.select_by_user(self.request.user)