blob: 8011c110b85804de293d1027b920279a18bb538b [file] [log] [blame]
Scott Bakerfb9544a2016-03-25 10:55:03 -07001from rest_framework import generics
2from rest_framework import serializers
3from rest_framework.response import Response
4from rest_framework import status
5from xos.apibase import XOSRetrieveUpdateDestroyAPIView, XOSListCreateAPIView
6from rest_framework import viewsets
7from django.conf.urls import patterns, url
8
Scott Bakerbca3a1b2016-03-28 13:22:10 -07009if hasattr(serializers, "ReadOnlyField"):
10 # rest_framework 3.x
11 ReadOnlyField = serializers.ReadOnlyField
12else:
13 # rest_framework 2.x
14 ReadOnlyField = serializers.Field
15
Scott Bakerfb9544a2016-03-25 10:55:03 -070016""" PlusSerializerMixin
17
18 Implements Serializer fields that are common to all OpenCloud objects. For
19 example, stuff related to backend fields.
20"""
21
Scott Bakera7919e22016-03-31 16:30:00 -070022class PlusModelSerializer(serializers.ModelSerializer):
Scott Bakerfb9544a2016-03-25 10:55:03 -070023 backendIcon = serializers.SerializerMethodField("getBackendIcon")
24 backendHtml = serializers.SerializerMethodField("getBackendHtml")
25
26 # This will cause a descendant class to pull in the methods defined
27 # above. See rest_framework/serializers.py: _get_declared_fields().
28 base_fields = {"backendIcon": backendIcon, "backendHtml": backendHtml}
29 # Rest_framework 3.0 uses _declared_fields instead of base_fields
30 _declared_fields = {"backendIcon": backendIcon, "backendHtml": backendHtml}
31
32 def getBackendIcon(self, obj):
33 return obj.getBackendIcon()
34
35 def getBackendHtml(self, obj):
36 return obj.getBackendHtml()
37
Scott Bakera7919e22016-03-31 16:30:00 -070038 def create(self, validated_data):
39 property_fields = getattr(self, "property_fields", [])
40 create_fields = {}
41 for k in validated_data:
42 if not k in property_fields:
43 create_fields[k] = validated_data[k]
44 obj = self.Meta.model(**create_fields)
45
46 for k in validated_data:
47 if k in property_fields:
48 setattr(obj, k, validated_data[k])
49
50 obj.caller = self.context['request'].user
51 obj.save()
52 return obj
53
54 def update(self, instance, validated_data):
55 nested_fields = getattr(self, "nested_fields", [])
56 for k in validated_data.keys():
57 v = validated_data[k]
58 if k in nested_fields:
59 d = getattr(instance,k)
60 d.update(v)
61 setattr(instance,k,d)
62 else:
63 setattr(instance, k, v)
64 instance.caller = self.context['request'].user
65 instance.save()
66 return instance
67
Scott Bakerfb9544a2016-03-25 10:55:03 -070068class XOSViewSet(viewsets.ModelViewSet):
Scott Bakerd9d55f22016-03-25 13:33:11 -070069 api_path=""
70
Scott Bakerfb9544a2016-03-25 10:55:03 -070071 @classmethod
72 def detail_url(self, pattern, viewdict, name):
Scott Bakerbca3a1b2016-03-28 13:22:10 -070073 return url(self.api_path + self.method_name + r'/(?P<pk>[a-zA-Z0-9\-]+)/' + pattern,
Scott Bakerfb9544a2016-03-25 10:55:03 -070074 self.as_view(viewdict),
75 name=self.base_name+"_"+name)
76
77 @classmethod
78 def list_url(self, pattern, viewdict, name):
Scott Bakerbca3a1b2016-03-28 13:22:10 -070079 return url(self.api_path + self.method_name + r'/' + pattern,
Scott Bakerfb9544a2016-03-25 10:55:03 -070080 self.as_view(viewdict),
81 name=self.base_name+"_"+name)
82
83 @classmethod
Scott Bakerbca3a1b2016-03-28 13:22:10 -070084 def get_urlpatterns(self, api_path="^"):
Scott Bakerd9d55f22016-03-25 13:33:11 -070085 self.api_path = api_path
86
Scott Bakerfb9544a2016-03-25 10:55:03 -070087 patterns = []
88
Scott Baker7603c262016-03-31 12:00:50 -070089 patterns.append(url(self.api_path + self.method_name + '/$', self.as_view({'get': 'list', 'post': 'create'}), name=self.base_name+'_list'))
Scott Bakerbca3a1b2016-03-28 13:22:10 -070090 patterns.append(url(self.api_path + self.method_name + '/(?P<pk>[a-zA-Z0-9\-]+)/$', self.as_view({'get': 'retrieve', 'put': 'update', 'post': 'update', 'delete': 'destroy', 'patch': 'partial_update'}), name=self.base_name+'_detail'))
Scott Bakerfb9544a2016-03-25 10:55:03 -070091
92 return patterns