All you need to do is take this code and put it somewhere in ${DIA_SHARE_FOLDER}/python/codegen.py (where DIA_SHARE_FOLDER is generally /usr/share/dia), add an import re at the beginning of that file and this:
dia.register_export ("PyDia Code Generation (Django)", "py", DjangoRenderer())
at the very end (together with the other generators).
The code is:
class DjangoRenderer(ObjRenderer) :
mapp = {"Datetime" : "DateTime"}
def __init__(self) :
ObjRenderer.__init__(self)
self.processed_kls = set([])
def end_render(self) :
re_foreign = re.compile(r"[cC]lass\s*(.*).*")
field_str = "\t%s = models.%sField(%s) %s\n"
foreign_str = "\t%s = models.ForeignKey('%s'%s) %s\n"
f = open(self.filename, "w")
f.write("from django.db import models %s" % ("\n" * 3))
for sk in self.klasses.keys() :
parents = self.klasses[sk].parents + self.klasses[sk].templates
f.write ("class %s (models.Model):\n" % (sk,))
kls_attributes = dict(self.klasses[sk].attributes)
attributes = kls_attributes.keys()
if attributes.__len__() == 0:
f.write("\tpass\n\n")
else:
for sa in attributes :
comments = ""
attr = kls_attributes[sa]
value = attr[2] == "" and "None" or attr[2]
comments = attr[3]
if attr[3]:
comments = "#%s" % attr[3].replace('\n', ' ')
try:
ty, parms = [x.strip() for x in attr[0].split("|")]
except ValueError:
ty, parms = (attr[0], "")
mobj = re_foreign.match(ty)
if mobj:
foreign_obj = mobj.groups()[0]
f.write(foreign_str % (sa, foreign_obj, parms, comments))
else:
ty = ty.capitalize()
ty = self.mapp.get(ty, ty)
f.write(field_str % (sa, ty, parms, comments))
else:
f.write("\n" * 2)
f.close()
ObjRenderer.end_render(self)
Now. The only thing to take into consideration is, when designing in DIA, you have to be a bit more specific in the Type of properties of your classes.
For instance. If you want a property to be of type string, you should specify it as:
Char | max_length=200, null=True.
This tells the exporter that it should construct a
models.CharField(max_length=200, null=True)
If you want to specify a ForeignKey, the type should be:
Class SomeClassor if you have options (like related_name), this should be:
Class SomeClass | related_name=some.
Hope this serves you somehow.
kayseriescortu.com - alacam.org - xescortun.com
ResponderEliminar