removing plural from model names. some cleanup
[plstackapi.git] / planetstack / apigen / modelgen
old mode 100755 (executable)
new mode 100644 (file)
index 4c8a0f1..04ca0fa
@@ -2,24 +2,35 @@
 
 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('.')
 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():
        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
 
@@ -32,17 +43,39 @@ 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 singular(self):
+            return str(self)
+
+        def rest_name(self):
+            # These are things that either for historic reasons or due to incorrect naming,
+            # got called something different than the autogen thinks they should be
+            # called.
+            REST_FIXUP = {'controllernetworkses': 'controllernetworks',
+                            'controllerimageses': 'controllerimages',
+                            'controllersliceses': 'controllerslices',
+                            'controlleruserses': 'controllerusers',
+                            'sitedeploymentses': 'sitedeployments',
+                            'siteroles': 'site_roles',
+                            'sliceprivileges': 'slice_privileges',
+                            'sliceroles': 'slice_roles',
+                            }
+            return REST_FIXUP.get(self.plural(), self.plural())
 
        def camel(self):
                name = str(self.model.__name__)
-               return name.title()
+               return name
                
 class Generator(dict):
        def all(self):
@@ -59,13 +92,58 @@ 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
+                                               refobj.refs.append(cobj)
                                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]
+
+                               related_name = f.related_query_name()
+                               if related_model_name in self.keys():
+                                        #print "XXX1", obj, f, related_name, related_model_name
+                                       refobj = self[related_model_name]
+                                       cobj = copy.deepcopy(obj)
+                                       cobj.multi=True
+                                       refobj.refs.append(cobj)
+
+                                # deal with upgradeFrom_rel_+
+                                if (related_name.endswith("+")):
+                                    continue
+
+                               if (related_name!='+' and related_name.lower()!=str(obj).lower()):
+                                        #print "XXX2", obj, f, related_name, related_model_name, refobj.plural_name
+                                        refobj = self[related_model_name]
+                                       cobj = copy.deepcopy(refobj)
+                                       cobj.multi = True
+
+                                       obj.refs.append(cobj)
+
+
+
                        
 def main():
        try: