blob: b403c0b49f2ed94840bd7a01a633996ab6b65978 [file] [log] [blame]
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -05001#!/usr/bin/python
2
3import os
4import pdb
Sapan Bhatiacdd90b72014-01-28 20:03:13 -05005import copy
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -05006import sys
7import json
8import re
9from django.template import Context, Template
10
Sapan Bhatiadf2b49e2014-01-28 19:41:07 -050011blacklist = ['SingletonModel','PlCoreBase']
12
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -050013# Django set up
14
15sys.path.append('.')
16os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
Sapan Bhatiaeb62ad62014-01-28 14:29:08 -050017from django.db.models.fields.related import ForeignKey, ManyToManyField
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -050018from core.models import *
19
Sapan Bhatiaeb62ad62014-01-28 14:29:08 -050020def singular(foo, keys):
21 for k in keys:
22 if (foo==k+'es'):
23 return k
24 elif (foo==k+'s'):
25 return k
26 raise Exception('Plural to singular error for %s'%foo)
27
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -050028g = globals()
29
30def enum_classes():
31 model_classes = []
32 for c in g.values():
Sapan Bhatiadf2b49e2014-01-28 19:41:07 -050033 if type(c)==type(PlCoreBase) and c.__name__ not in blacklist:
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -050034 model_classes.append(c)
35 return model_classes
36
37
38class GenObj(object):
39 def __str__(self):
40 return str(self.model.__name__.lower())
41
42 def __init__(self, m):
43 self.model = m
44 self.props = []
45 self.refs = []
Sapan Bhatiabe42fba2014-01-28 23:53:49 -050046 self.plural_name = None
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -050047
48 def plural(self):
Sapan Bhatiabe42fba2014-01-28 23:53:49 -050049 if (self.plural_name):
50 return self.plural_name
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -050051 else:
Sapan Bhatiabe42fba2014-01-28 23:53:49 -050052 name = str(self)
53 if (name.endswith('s')):
54 return name+'es'
55 else:
56 return name+'s'
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -050057
58 def camel(self):
59 name = str(self.model.__name__)
Sapan Bhatiadf2b49e2014-01-28 19:41:07 -050060 return name
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -050061
62class Generator(dict):
63 def all(self):
64 return self.values()
65
66 def regex(self, r):
67 filtered = filter(lambda o:re.match(r,str(o)), self.values())
68 return filtered
69
70 def add_object(self, o):
71 obj = GenObj(o)
72 fields = o._meta.fields
73 self[str(obj).lower()]=obj
74
75 def compute_links(self):
76 for obj in self.values():
Sapan Bhatiab5885402014-01-29 10:32:09 -050077 #if (str(obj)=='network'):
Sapan Bhatiacdd90b72014-01-28 20:03:13 -050078 # pdb.set_trace()
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -050079 fields = obj.model._meta.fields
80 for f in fields:
Sapan Bhatiab5885402014-01-29 10:32:09 -050081 if (f and f.rel):
82 to_name = str(f.rel.to)
83 else:
84 to_name = None
85
86 if type(f)==ForeignKey and to_name and to_name in self.keys():
87 refobj = self[f.to_name]
88
89 if (str(obj)=='slice' and f.to_name=='networks'):
90 obj.refs.append(refobj)
Sapan Bhatiabe42fba2014-01-28 23:53:49 -050091 related_name = f.related_query_name()
Sapan Bhatiab5885402014-01-29 10:32:09 -050092 if (related_name!='+' and related_name.lower()!=str(obj).lower()):
Sapan Bhatiabe42fba2014-01-28 23:53:49 -050093 cobj = copy.deepcopy(obj)
94 cobj.multi = True
95 cobj.plural_name = related_name
Sapan Bhatiab5885402014-01-29 10:32:09 -050096 #if (str(refobj)=='slice' and related_name=='networks'):
97 # pdb.set_trace()
Sapan Bhatiabe42fba2014-01-28 23:53:49 -050098 refobj.refs.append(cobj)
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -050099 else:
100 obj.props.append(f.name)
Sapan Bhatiab5885402014-01-29 10:32:09 -0500101
Sapan Bhatiaeb62ad62014-01-28 14:29:08 -0500102 m2m = obj.model._meta.many_to_many
103 for f in m2m:
104 try:
105 related_model_name = f.m2m_reverse_field_name()
106 except:
107 related_model_name = f.m2m_db_table().rsplit('_',1)[-1]
108
Sapan Bhatiab5885402014-01-29 10:32:09 -0500109 related_name = f.related_query_name()
Sapan Bhatiaeb62ad62014-01-28 14:29:08 -0500110 if related_model_name in self.keys():
Sapan Bhatiacdd90b72014-01-28 20:03:13 -0500111 # pdb.set_trace()
Sapan Bhatiaeb62ad62014-01-28 14:29:08 -0500112 refobj = self[related_model_name]
Sapan Bhatiacdd90b72014-01-28 20:03:13 -0500113 cobj = copy.deepcopy(obj)
114 cobj.multi=True
115 refobj.refs.append(cobj)
Scott Baker1e67bb42014-07-03 17:58:10 -0700116
117 # deal with upgradeFrom_rel_+
118 if (related_name.endswith("+")):
119 continue
120
Sapan Bhatiab5885402014-01-29 10:32:09 -0500121 if (related_name!='+' and related_name.lower()!=str(obj).lower()):
Sapan Bhatiabe42fba2014-01-28 23:53:49 -0500122 cobj = copy.deepcopy(obj)
123 cobj.multi = True
124 cobj.plural_name = related_name
Sapan Bhatiab5885402014-01-29 10:32:09 -0500125
126 #if (str(refobj)=='slice' and related_name=='networks'):
127 # pdb.set_trace()
Sapan Bhatia4efd0d92014-01-29 00:20:06 -0500128 refobj.refs.append(cobj)
Sapan Bhatiabe42fba2014-01-28 23:53:49 -0500129
Sapan Bhatiab5885402014-01-29 10:32:09 -0500130 #if (related_name=='networks'):
131 #pdb.set_trace()
132 #print str(refobj)
133
Sapan Bhatiabe42fba2014-01-28 23:53:49 -0500134
Sapan Bhatiaeb62ad62014-01-28 14:29:08 -0500135
Sapan Bhatia3a45f8b2014-01-14 21:20:16 -0500136
137def main():
138 try:
139 output = sys.argv[1]
140 except:
141 print 'Usage: modelgen <output template>'
142 exit(1)
143
144 generator = Generator()
145
146 models = enum_classes()
147
148 for m in models:
149 generator.add_object(m)
150
151 generator.compute_links()
152 template_contents = open(output).read()
153 template = Template(template_contents)
154 context = Context({'generator':generator})
155 print template.render(context)
156
157
158if (__name__=='__main__'):
159 main()