#!/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__] d['NetworkDeployments'].append('SliceDeployments') print json.dumps(d,indent=4)