From: Sapan Bhatia Date: Wed, 11 Jun 2014 20:58:58 +0000 (-0400) Subject: Merge branch 'apigen' X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=8e672994e36488438962554ce5a3529e34818e9d;hp=e3bbcf622e692f93fcc62ff7be7f49a206249b6c;p=plstackapi.git Merge branch 'apigen' --- diff --git a/planetstack/apigen/api.template.py b/planetstack/apigen/api.template.py index de05fe6..6638808 100644 --- a/planetstack/apigen/api.template.py +++ b/planetstack/apigen/api.template.py @@ -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): diff --git a/planetstack/apigen/modelgen b/planetstack/apigen/modelgen index d2e80f5..ef2730b 100755 --- a/planetstack/apigen/modelgen +++ b/planetstack/apigen/modelgen @@ -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(): diff --git a/planetstack/apigen/simple.template.txt b/planetstack/apigen/simple.template.txt index 109927e..fb00670 100644 --- a/planetstack/apigen/simple.template.txt +++ b/planetstack/apigen/simple.template.txt @@ -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 %} diff --git a/planetstack/planetstack/urls.py b/planetstack/planetstack/urls.py index 49b144f..599b20b 100644 --- a/planetstack/planetstack/urls.py +++ b/planetstack/planetstack/urls.py @@ -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 *