#!/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)
	
	
