Merge branch 'apigen'
authorSapan Bhatia <gwsapan@gmail.com>
Wed, 11 Jun 2014 20:58:58 +0000 (16:58 -0400)
committerSapan Bhatia <gwsapan@gmail.com>
Wed, 11 Jun 2014 20:58:58 +0000 (16:58 -0400)
planetstack/apigen/api.template.py
planetstack/apigen/modelgen
planetstack/apigen/simple.template.txt
planetstack/planetstack/urls.py

index de05fe6..6638808 100644 (file)
@@ -2,6 +2,7 @@ from rest_framework.decorators import api_view
 from rest_framework.response import Response
 from rest_framework.reverse import reverse
 from rest_framework import serializers
+from rest_framework import generics
 from core.models import *
 from django.forms import widgets
 
@@ -38,12 +39,12 @@ class {{ object.camel }}Serializer(serializers.HyperlinkedModelSerializer):
        {% if ref.multi %}
        {{ ref.plural }} = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='{{ ref }}-detail')
        {% else %}
-       {{ ref }} = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='{{ ref }}-detail')
+       {{ ref }} = serializers.HyperlinkedRelatedField(read_only=True, view_name='{{ ref }}-detail')
        {% endif %}
        {% endfor %}
        class Meta:
-               model = {{ object }}
-               fields = ({% for prop in object.props %}'{{ prop }}',{% endfor %})
+               model = {{ object.camel }}
+               fields = ({% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
 {% endfor %}
 
 serializerLookUp = { 
@@ -57,7 +58,7 @@ serializerLookUp = {
 {% for object in generator.all %}
 
 class {{ object.camel }}List(generics.ListCreateAPIView):
-    queryset = {{ object.camel }}.objects.select_related.all()
+    queryset = {{ object.camel }}.objects.select_related().all()
     serializer_class = {{ object.camel }}Serializer
     
     def get_queryset(self):
@@ -73,7 +74,7 @@ class {{ object.camel }}List(generics.ListCreateAPIView):
             return Response(status=status.HTTP_400_BAD_REQUEST)
 
 class {{ object.camel }}Detail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = {{ object.camel }}.objects.select_related.all()
+    queryset = {{ object.camel }}.objects.select_related().all()
     serializer_class = {{ object.camel }}Serializer
     
     def get_queryset(self):
index d2e80f5..ef2730b 100755 (executable)
@@ -2,11 +2,14 @@
 
 import os
 import pdb
+import copy
 import sys
 import json
 import re
 from django.template import Context, Template
 
+blacklist = ['SingletonModel','PlCoreBase']
+
 # Django set up
 
 sys.path.append('.')
@@ -27,7 +30,7 @@ g = globals()
 def enum_classes():
        model_classes = []
        for c in g.values():
-               if type(c)==type(PlCoreBase):
+               if type(c)==type(PlCoreBase) and c.__name__ not in blacklist:
                        model_classes.append(c)
        return model_classes
 
@@ -40,17 +43,21 @@ class GenObj(object):
                self.model = m
                self.props = []
                self.refs = []
+               self.plural_name = None
 
        def plural(self):
-               name = str(self)
-               if (name.endswith('s')):
-                       return name+'es'
+               if (self.plural_name):
+                       return self.plural_name
                else:
-                       return name+'s'
+                       name = str(self)
+                       if (name.endswith('s')):
+                               return name+'es'
+                       else:
+                               return name+'s'
 
        def camel(self):
                name = str(self.model.__name__)
-               return name.title()
+               return name
                
 class Generator(dict):
        def all(self):
@@ -67,13 +74,31 @@ class Generator(dict):
 
        def compute_links(self):
                for obj in self.values():
+                       #if (str(obj)=='network'):
+                       #       pdb.set_trace()
                        fields = obj.model._meta.fields
                        for f in fields:
-                               if type(f)==ForeignKey and f.name in self.keys():
-                                       refobj = self[f.name]
-                                       obj.refs.append(refobj)
+                               if (f and f.rel):
+                                       to_name = str(f.rel.to)
+                               else:
+                                       to_name = None
+
+                               if type(f)==ForeignKey and to_name and to_name in self.keys():
+                                       refobj = self[f.to_name]
+
+                                       if (str(obj)=='slice' and f.to_name=='networks'):
+                                               obj.refs.append(refobj)
+                                       related_name = f.related_query_name()
+                                       if (related_name!='+' and related_name.lower()!=str(obj).lower()):
+                                               cobj = copy.deepcopy(obj)
+                                               cobj.multi = True
+                                               cobj.plural_name = related_name
+                                               #if (str(refobj)=='slice' and related_name=='networks'):
+                                               #       pdb.set_trace()
+                                               refobj.refs.append(cobj)
                                else:
                                        obj.props.append(f.name)
+
                        m2m = obj.model._meta.many_to_many
                        for f in m2m:
                                try:
@@ -81,10 +106,28 @@ class Generator(dict):
                                except:
                                        related_model_name = f.m2m_db_table().rsplit('_',1)[-1]
 
+                               related_name = f.related_query_name()
                                if related_model_name in self.keys():
+                       #               pdb.set_trace()
                                        refobj = self[related_model_name]
-                                       obj.multi=True
-                                       refobj.refs.append(obj)
+                                       cobj = copy.deepcopy(obj)
+                                       cobj.multi=True
+                                       refobj.refs.append(cobj)
+                               
+                               if (related_name!='+' and related_name.lower()!=str(obj).lower()):
+                                       cobj = copy.deepcopy(obj)
+                                       cobj.multi = True
+                                       cobj.plural_name = related_name
+
+                                       #if (str(refobj)=='slice' and related_name=='networks'):
+                                       #       pdb.set_trace()
+                                       refobj.refs.append(cobj)
+
+                                       #if (related_name=='networks'):
+                                               #pdb.set_trace()
+                                               #print str(refobj)
+
+
 
                        
 def main():
index 109927e..fb00670 100644 (file)
@@ -1,7 +1,8 @@
 {% for object in generator.all %}
 Object {{ object }}:
 Refs:
-{% for ref in object.refs %}{{ ref }}{% endfor %}
+{% for ref in object.refs %}
+{{ ref }}{% endfor %}
 Props:
 {% for prop in object.props %}{{ prop }}
 {% endfor %}
index 49b144f..599b20b 100644 (file)
@@ -16,7 +16,7 @@ from core.views.slices import SliceList, SliceDetail
 from core.views.slice_privileges import SlicePrivilegeList, SlicePrivilegeDetail
 from core.views.slivers import SliverList, SliverDetail
 from core.views.tags import TagList, TagDetail
-from core.views.users import UserList, UserDetail
+from genapi import UserList, UserDetail
 from core.views.legacyapi import LegacyXMLRPC
 #from core.views.analytics import AnalyticsAjaxView
 from core.models import *