Fixed some bugs in many to many and generic properties
authorSapan Bhatia <gwsapan@gmail.com>
Tue, 28 Jan 2014 19:29:08 +0000 (14:29 -0500)
committerSapan Bhatia <gwsapan@gmail.com>
Tue, 28 Jan 2014 19:29:08 +0000 (14:29 -0500)
planetstack/apigen/api.template.py
planetstack/apigen/modelgen

index 81a1eca..690bb13 100644 (file)
@@ -35,7 +35,11 @@ def api_root(request, format=None):
 class {{ object.camel }}Serializer(serializers.HyperlinkedModelSerializer):
        id = serializers.Field()
        {% for ref in object.refs %}
-       {{ ref.plural }} = serializers.HyperlinkedRelatedField(view_name='{{ ref }}-detail')
+       {% 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')
+       {% endif %}
        {% endfor %}
        class Meta:
                model = {{ object }}
@@ -53,11 +57,11 @@ serializerLookUp = {
 {% for object in generator.all %}
 
 class {{ object.camel }}List(generics.ListCreateAPIView):
-    queryset = {{ object.camel }}.objects.all()
+    queryset = {{ object.camel }}.objects.select_related.all()
     serializer_class = {{ object.camel }}Serializer
 
 class {{ object.camel }}Detail(generics.RetrieveUpdateDestroyAPIView):
-    queryset = {{ object.camel }}.objects.all()
+    queryset = {{ object.camel }}.objects.select_related.all()
     serializer_class = {{ object.camel }}Serializer
 
 {% endfor %}
index 4c8a0f1..d2e80f5 100755 (executable)
@@ -11,9 +11,17 @@ from django.template import Context, Template
 
 sys.path.append('.')
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
-from django.db.models.fields.related import ForeignKey
+from django.db.models.fields.related import ForeignKey, ManyToManyField
 from core.models import *
 
+def singular(foo, keys):
+       for k in keys:
+               if (foo==k+'es'):
+                       return k
+               elif (foo==k+'s'):
+                       return k
+       raise Exception('Plural to singular error for %s'%foo)
+
 g = globals()
 
 def enum_classes():
@@ -66,6 +74,18 @@ class Generator(dict):
                                        obj.refs.append(refobj)
                                else:
                                        obj.props.append(f.name)
+                       m2m = obj.model._meta.many_to_many
+                       for f in m2m:
+                               try:
+                                       related_model_name = f.m2m_reverse_field_name()
+                               except:
+                                       related_model_name = f.m2m_db_table().rsplit('_',1)[-1]
+
+                               if related_model_name in self.keys():
+                                       refobj = self[related_model_name]
+                                       obj.multi=True
+                                       refobj.refs.append(obj)
+
                        
 def main():
        try: