blob: f38650d3a0a8f7ea35789ef0c192a97040e8bad7 [file] [log] [blame]
#!/usr/bin/python
import os
import pdb
import sys
import json
sys.path.append('.')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
from django.db.models.fields.related import ForeignKey
# defaults
app = "core"
output = "-json"
# syntax: dmdot [-json | -dot] [app_name]
# poor man's argument parser
for arg in sys.argv[1:]:
if arg.startswith("-"):
output = arg
else:
app = arg
app = app + ".models"
#models_module = imp.load_source(app, ".")
models_module = __import__(app)
for part in app.split(".")[1:]:
if hasattr(models_module, "PlCoreBase"):
break
models_module = getattr(models_module,part)
PlCoreBase = getattr(models_module,"PlCoreBase")
model_classes = []
class_names = []
lower_class_names = {}
for classname in dir(models_module):
c = getattr(models_module, classname, None)
if type(c)==type(PlCoreBase):
model_classes.append(c)
class_names.append(c.__name__)
lower_class_names[c.__name__.lower()] = c
# django doesn't use the correct case in field.name.title() for objects that
# have CamelCased class names. So, compare everything in lower case.
if (output=='-dot'):
print "digraph plstack {";
for c in model_classes:
fields = c._meta.fields
for f in fields:
if type(f)==ForeignKey and f.name.lower() in lower_class_names:
linked_class = lower_class_names[f.name.lower()]
print '\t"%s"->"%s";'%(c.__name__,linked_class.__name__)
print "}\n";
elif (output=='-json'):
d = {}
for c in model_classes:
fields = c._meta.fields
for f in fields:
if type(f)==ForeignKey and f.name.lower() in lower_class_names:
linked_class = lower_class_names[f.name.lower()]
try:
d[c.__name__].append(linked_class.__name__)
except KeyError:
d[c.__name__]=[linked_class.__name__]
print json.dumps(d,indent=4)