1 from rest_framework.decorators import api_view
2 from rest_framework.response import Response
3 from rest_framework.reverse import reverse
4 from rest_framework import serializers
5 from rest_framework import generics
6 from core.models import *
7 from django.forms import widgets
8 from rest_framework import filters
11 Schema of the generator object:
12 all: Set of all Model objects
13 all_if(regex): Set of Model objects that match regex
16 plural: English plural of object name
17 camel: CamelCase version of object name
18 refs: list of references to other Model objects
19 props: list of properties minus refs
21 TODO: Deal with subnets
24 # Based on api_root.py
27 def api_root(request, format=None):
29 {% for object in generator.all %}'{{ object.plural }}': reverse('{{ object }}-list', request=request, format=format),
33 # Based on serializers.py
35 {% for object in generator.all %}
37 class {{ object.camel }}Serializer(serializers.HyperlinkedModelSerializer):
38 id = serializers.Field()
39 {% for ref in object.refs %}
41 {{ ref.plural }} = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='{{ ref }}-detail')
43 {{ ref }} = serializers.HyperlinkedRelatedField(read_only=True, view_name='{{ ref }}-detail')
47 model = {{ object.camel }}
48 fields = ({% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
50 class {{ object.camel }}IdSerializer(serializers.ModelSerializer):
51 id = serializers.Field()
52 {% for ref in object.refs %}
54 {{ ref.plural }} = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='{{ ref }}-detail')
56 {{ ref }} = serializers.HyperlinkedRelatedField(read_only=True, view_name='{{ ref }}-detail')
60 model = {{ object.camel }}
61 fields = ({% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
67 {% for object in generator.all %}
68 {{ object.camel }}: {{ object.camel }}Serializer,
73 # Based on core/views/*.py
74 {% for object in generator.all %}
76 class {{ object.camel }}List(generics.ListCreateAPIView):
77 queryset = {{ object.camel }}.objects.select_related().all()
78 serializer_class = {{ object.camel }}Serializer
79 id_serializer_class = {{ object.camel }}IdSerializer
80 filter_backends = (filters.DjangoFilterBackend,)
81 filter_fields = ({% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
83 def get_serializer_class(self):
84 no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
86 return self.id_serializer_class
88 return self.serializer_class
90 def get_queryset(self):
91 return {{ object.camel }}.select_by_user(self.request.user)
93 def create(self, request, *args, **kwargs):
94 #obj = {{ object.camel }}().update(request.DATA)
95 obj = self.get_object()
96 obj.caller = request.user
97 if obj.can_update(request.user):
98 return super({{ object.camel }}List, self).create(request, *args, **kwargs)
100 return Response(status=status.HTTP_400_BAD_REQUEST)
102 class {{ object.camel }}Detail(generics.RetrieveUpdateDestroyAPIView):
103 queryset = {{ object.camel }}.objects.select_related().all()
104 serializer_class = {{ object.camel }}Serializer
105 id_serializer_class = {{ object.camel }}IdSerializer
107 def get_serializer_class(self):
108 no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
110 return self.id_serializer_class
112 return self.serializer_class
114 def get_queryset(self):
115 return {{ object.camel }}.select_by_user(self.request.user)
117 def update(self, request, *args, **kwargs):
118 obj = self.get_object()
119 if obj.can_update(request.user):
120 return super({{ object.camel }}Detail, self).update(request, *args, **kwargs)
122 return Response(status=status.HTTP_400_BAD_REQUEST)
124 def destroy(self, request, *args, **kwargs):
125 obj = self.get_object()
126 if obj.can_update(request.user):
127 return super({{ object.camel }}Detail, self).destroy(request, *args, **kwargs)
129 return Response(status=status.HTTP_400_BAD_REQUEST)