Merge branch 'master' of ssh://git.planet-lab.org/git/plstackapi
Conflicts:
planetstack/apigen/api.template.py
diff --git a/planetstack/apigen/api.template.py b/planetstack/apigen/api.template.py
index 84f7613..de05fe6 100644
--- a/planetstack/apigen/api.template.py
+++ b/planetstack/apigen/api.template.py
@@ -35,7 +35,11 @@
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,7 +57,7 @@
{% 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
def get_queryset(self):
@@ -69,7 +73,7 @@
return Response(status=status.HTTP_400_BAD_REQUEST)
class {{ object.camel }}Detail(generics.RetrieveUpdateDestroyAPIView):
- #queryset = {{ object.camel }}.objects.all()
+ queryset = {{ object.camel }}.objects.select_related.all()
serializer_class = {{ object.camel }}Serializer
def get_queryset(self):
diff --git a/planetstack/apigen/modelgen b/planetstack/apigen/modelgen
index 4c8a0f1..d2e80f5 100755
--- a/planetstack/apigen/modelgen
+++ b/planetstack/apigen/modelgen
@@ -11,9 +11,17 @@
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 @@
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: