From 1eff85deddc953cedcc8b93068540665d2e74da1 Mon Sep 17 00:00:00 2001 From: Scott Baker Date: Thu, 26 Dec 2013 16:39:49 -0800 Subject: [PATCH 1/1] Support optional application-name argument, fix CamelCased objects in ForeignKeys --- planetstack/dmdot | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/planetstack/dmdot b/planetstack/dmdot index 2d95e9d..4353793 100755 --- a/planetstack/dmdot +++ b/planetstack/dmdot @@ -10,40 +10,61 @@ sys.path.append('.') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings") from django.db.models.fields.related import ForeignKey -from core.models import * -try: - output = sys.args[1] -except: - output = '-json' +# 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:]: + models_module = getattr(models_module,part) + +PlCoreBase = getattr(models_module,"PlCoreBase") -g = globals() model_classes = [] class_names = [] -for c in g.values(): +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.title() in class_names: - print '\t"%s"->"%s";'%(c.__name__,f.name.title()) + 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.title() in class_names: + 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(f.name.title()) + d[c.__name__].append(linked_class.__name__) except KeyError: - d[c.__name__]=[f.name.title()] + d[c.__name__]=[linked_class.__name__] print json.dumps(d,indent=4) -- 2.43.0