blob: f438aad0f722ab8aada20e1cc108f6aed45c3bec [file] [log] [blame]
Sapan Bhatiad7425452013-09-03 11:45:15 -04001#!/usr/bin/python
2
3import os
4import pdb
5import sys
6import json
7
8sys.path.append('.')
9
Scott Baker9ecc8392015-02-18 11:29:05 -080010os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
Sapan Bhatiad7425452013-09-03 11:45:15 -040011
12from django.db.models.fields.related import ForeignKey
Sapan Bhatiad7425452013-09-03 11:45:15 -040013
Scott Bakerceb464b2014-04-03 11:03:11 -070014# defaults
Scott Baker72bee302015-10-19 16:49:52 -070015apps = ["core", "hpc", "cord", "requestrouter", "services.onos"]
Scott Bakerceb464b2014-04-03 11:03:11 -070016output = "-json"
Sapan Bhatiad7425452013-09-03 11:45:15 -040017
Scott Bakerceb464b2014-04-03 11:03:11 -070018# syntax: dmdot [-json | -dot] [app_name]
19
20# poor man's argument parser
21for arg in sys.argv[1:]:
22 if arg.startswith("-"):
23 output = arg
24 else:
Sapan Bhatia4cbe7002015-10-21 17:03:33 +020025 apps+= [arg]
Scott Bakerceb464b2014-04-03 11:03:11 -070026
Sapan Bhatiad7425452013-09-03 11:45:15 -040027model_classes = []
28class_names = []
Scott Bakerceb464b2014-04-03 11:03:11 -070029lower_class_names = {}
Sapan Bhatiac92e5052015-08-26 11:43:10 -040030synonyms = {
31 'user':'creator'
32}
33
34for app in apps:
35 app = app + ".models"
36 #models_module = imp.load_source(app, ".")
37 models_module = __import__(app)
38 for part in app.split(".")[1:]:
39 if hasattr(models_module, "PlCoreBase"):
40 break
41 models_module = getattr(models_module,part)
42
43 PlCoreBase = getattr(models_module,"PlCoreBase")
44
Sapan Bhatiac92e5052015-08-26 11:43:10 -040045 for classname in dir(models_module):
46 c = getattr(models_module, classname, None)
47 if type(c)==type(PlCoreBase):
48 model_classes.append(c)
49 class_names.append(c.__name__)
50 lower_class_names[c.__name__.lower()] = c
51 try:
52 synonym = synonyms[c.__name__.lower()]
53 lower_class_names[synonym] = c
54 except:
55 pass
56
Sapan Bhatiad7425452013-09-03 11:45:15 -040057
Scott Bakerceb464b2014-04-03 11:03:11 -070058# django doesn't use the correct case in field.name.title() for objects that
59# have CamelCased class names. So, compare everything in lower case.
Sapan Bhatiad7425452013-09-03 11:45:15 -040060
61if (output=='-dot'):
Sapan Bhatiacb7aa3a2015-01-29 20:40:13 +000062 print "digraph plstack {";
63 for c in model_classes:
64 fields = c._meta.fields
65
66 for f in fields:
Sapan Bhatia8f8eb6b2015-09-02 11:49:51 -040067 if type(f)==ForeignKey and f.name.lower().split('_') in lower_class_names:
Scott Bakerceb464b2014-04-03 11:03:11 -070068 linked_class = lower_class_names[f.name.lower()]
Sapan Bhatia8f8eb6b2015-09-02 11:49:51 -040069 if ('backref' in f.name):
70 print '\t"%s"->"%s";'%(linked_class.__name__,c.__name__)
71 else:
72 print '\t"%s"->"%s";'%(c.__name__,linked_class.__name__)
Sapan Bhatiacb7aa3a2015-01-29 20:40:13 +000073 print "}\n";
Sapan Bhatiad7425452013-09-03 11:45:15 -040074elif (output=='-json'):
Sapan Bhatiacb7aa3a2015-01-29 20:40:13 +000075 d = {}
76 for c in model_classes:
77 fields = c._meta.fields
Sapan Bhatia8f8eb6b2015-09-02 11:49:51 -040078
Sapan Bhatiacb7aa3a2015-01-29 20:40:13 +000079 for f in fields:
Sapan Bhatia8f8eb6b2015-09-02 11:49:51 -040080 field_type = f.name.lower().split('_')[0]
81 if type(f)==ForeignKey and field_type in lower_class_names:
82 linked_class = lower_class_names[field_type]
83 if ('backref' in f.name.lower()):
84 a = linked_class.__name__
85 b = c.__name__
86 else:
87 b = linked_class.__name__
88 a = c.__name__
89
Sapan Bhatiacb7aa3a2015-01-29 20:40:13 +000090 try:
Sapan Bhatia8f8eb6b2015-09-02 11:49:51 -040091 if (b not in d[a]):
92 d[a].append(b)
Sapan Bhatiacb7aa3a2015-01-29 20:40:13 +000093 except KeyError:
94 d[c.__name__]=[linked_class.__name__]
95 #d['ControllerNetwork'].append('SliceDeployments')
96 print json.dumps(d,indent=4)
97
98