From eb62ad61ef3ca0b8dd5e641ac8e841eb0f17e8ae Mon Sep 17 00:00:00 2001 From: Sapan Bhatia Date: Tue, 28 Jan 2014 14:29:08 -0500 Subject: [PATCH] Fixed some bugs in many to many and generic properties --- planetstack/apigen/api.template.py | 10 +++++++--- planetstack/apigen/modelgen | 22 +++++++++++++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/planetstack/apigen/api.template.py b/planetstack/apigen/api.template.py index 81a1eca..690bb13 100644 --- a/planetstack/apigen/api.template.py +++ b/planetstack/apigen/api.template.py @@ -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 %} 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 @@ 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: -- 2.43.0