rest_framework doesn't have a serializers.ReadOnlyField
[plstackapi.git] / planetstack / core / xoslib / methods / sliceplus.py
1 from rest_framework.decorators import api_view
2 from rest_framework.response import Response\r
3 from rest_framework.reverse import reverse\r
4 from rest_framework import serializers\r
5 from rest_framework import generics\r
6 from core.models import *\r
7 from django.forms import widgets
8 from core.xoslib.objects.sliceplus import SlicePlus
9 from plus import PlusSerializerMixin
10
11 if hasattr(serializers, "ReadOnlyField"):
12     # rest_framework 3.x
13     IdField = serializers.ReadOnlyField
14 else:
15     # rest_framework 2.x
16     IdField = serializers.Field
17
18 class SlicePlusIdSerializer(serializers.ModelSerializer, PlusSerializerMixin):
19         id = IdField()
20 \r
21         sliceInfo = serializers.SerializerMethodField("getSliceInfo")\r
22         humanReadableName = serializers.SerializerMethodField("getHumanReadableName")\r
23 \r
24         def getSliceInfo(self, slice):\r
25             return slice.getSliceInfo(user=self.context['request'].user)\r
26 \r
27         def getHumanReadableName(self, obj):\r
28             return str(obj)\r
29 \r
30         networks = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='network-detail')\r
31         availableNetworks = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='network-detail')\r
32 \r
33         class Meta:\r
34             model = SlicePlus\r
35             fields = ('humanReadableName', 'id','created','updated','enacted','name','enabled','omf_friendly','description','slice_url','site','max_slivers','imagePreference','service','network','mountDataSets','serviceClass','creator','networks','availableNetworks','sliceInfo','backendIcon','backendHtml')
36
37 class SlicePlusList(generics.ListCreateAPIView):
38     queryset = SlicePlus.objects.select_related().all()
39     serializer_class = SlicePlusIdSerializer
40
41     method_kind = "list"
42     method_name = "slicesplus"
43
44     def get_queryset(self):
45         return SlicePlus.select_by_user(self.request.user)
46
47     def create(self, request, *args, **kwargs):
48         obj = self.get_object()
49         obj.caller = request.user
50         if obj.can_update(request.user):
51             return super(SliceList, self).create(request, *args, **kwargs)
52         else:
53             return Response(status=status.HTTP_400_BAD_REQUEST)
54
55 class SlicePlusDetail(generics.RetrieveUpdateDestroyAPIView):
56     queryset = SlicePlus.objects.select_related().all()
57     serializer_class = SlicePlusIdSerializer
58
59     method_kind = "detail"
60     method_name = "slicesplus"
61
62     def get_queryset(self):
63         return SlicePlus.select_by_user(self.request.user)
64
65     def update(self, request, *args, **kwargs):
66         obj = self.get_object()
67         if obj.can_update(request.user):
68             return super(SlicePlusDetail, self).update(request, *args, **kwargs)
69         else:
70             return Response(status=status.HTTP_400_BAD_REQUEST)
71
72     def destroy(self, request, *args, **kwargs):
73         obj = self.get_object()
74         if obj.can_update(request.user):
75             return super(SlicePlusDetail, self).destroy(request, *args, **kwargs)
76         else:
77             return Response(status=status.HTTP_400_BAD_REQUEST)