#!/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
from core.models import *

try:
	output = sys.args[1]
except:
	output = '-json'

g = globals()
model_classes = []
class_names = []

for c in g.values():
	if type(c)==type(PlCoreBase):
		model_classes.append(c)
		class_names.append(c.__name__)


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())
	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:
				try:
					d[c.__name__].append(f.name.title())
				except KeyError:
					d[c.__name__]=[f.name.title()]
	print json.dumps(d,indent=4)
