forked from oyd/Adunatio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
8.4 KiB
212 lines
8.4 KiB
4 years ago
|
import mongoengine
|
||
|
import os
|
||
|
|
||
|
from models.Account import Account
|
||
|
from models.Payment import Payments
|
||
|
from models.User import *
|
||
|
from mongoengine import fields
|
||
|
types = {
|
||
|
mongoengine.fields.StringField: "String",
|
||
|
IntField: 'int',
|
||
|
BooleanField: 'bool',
|
||
|
FloatField: 'Float',
|
||
|
DictField: 'Map<String,dynamic>'
|
||
|
}
|
||
|
|
||
|
|
||
|
def to_camel_case(snake_str):
|
||
|
components = snake_str.split('_')
|
||
|
# We capitalize the first letter of each component except the first one
|
||
|
# with the 'title' method and join them together.
|
||
|
return components[0] + ''.join(x.title() for x in components[1:])
|
||
|
|
||
|
|
||
|
def buildReferenceField(field_object, builded):
|
||
|
if isinstance(field_object, (ReferenceField, EmbeddedDocumentField)):
|
||
|
if field_object.document_type not in builded:
|
||
|
builded.append(field_object.document_type)
|
||
|
return build_class(field_object.document_type, builded)
|
||
|
return None, builded
|
||
|
|
||
|
else:
|
||
|
return None, builded
|
||
|
|
||
|
|
||
|
def buildFields(field_object):
|
||
|
type = ""
|
||
|
if isinstance(field_object, mongoengine.fields.LongField):
|
||
|
type = "long"
|
||
|
elif isinstance(field_object, EncryptedStringField):
|
||
|
type = "String"
|
||
|
elif isinstance(field_object, fields.ImageField):
|
||
|
type = "String"
|
||
|
elif isinstance(field_object, EncryptedStringField):
|
||
|
type = "String"
|
||
|
elif isinstance(field_object, StringField):
|
||
|
type = "String"
|
||
|
elif isinstance(field_object, ObjectIdField):
|
||
|
type = "String"
|
||
|
elif isinstance(field_object, DateTimeField):
|
||
|
type = "DateTime"
|
||
|
elif isinstance(field_object, IntField):
|
||
|
type = "int"
|
||
|
elif isinstance(field_object, BooleanField):
|
||
|
type = "bool"
|
||
|
|
||
|
elif isinstance(field_object, FloatField):
|
||
|
type = "double"
|
||
|
elif isinstance(field_object, DictField):
|
||
|
type = "Map<String,dynamic>"
|
||
|
elif isinstance(field_object, DynamicField):
|
||
|
type = "dynamic"
|
||
|
else:
|
||
|
type = "String"
|
||
|
return type
|
||
|
|
||
|
|
||
|
def build_class(mongoClass, builded):
|
||
|
if builded is None:
|
||
|
builded = []
|
||
|
mClass = mongoClass
|
||
|
builded.append(mClass)
|
||
|
rClass = mongoClass()
|
||
|
builded.append(rClass)
|
||
|
class_list = []
|
||
|
field_list = []
|
||
|
for field in rClass._fields_ordered:
|
||
|
field_object = getattr(mClass, field)
|
||
|
ignore_fields = mClass._meta.get('ignore_fields')
|
||
|
autogen_fields = mClass._meta.get('auto_generated')
|
||
|
if not ignore_fields:
|
||
|
ignore_fields = []
|
||
|
if not autogen_fields:
|
||
|
autogen_fields = []
|
||
|
|
||
|
if isinstance(field_object, (ReferenceField, EmbeddedDocumentField)):
|
||
|
_, builded = buildReferenceField(field_object, builded)
|
||
|
if _ is not None:
|
||
|
class_list = class_list + list(_)
|
||
|
pn = field_object.document_type()
|
||
|
if field not in ignore_fields:
|
||
|
field_list.append(
|
||
|
{"type": pn._class_name, "origin_name": field, "name": to_camel_case(field), "islist": False,
|
||
|
"is_class": True, "required":field_object.required, "class_name": pn._class_name, "autogen": field in autogen_fields})
|
||
|
|
||
|
elif isinstance(field_object, ListField):
|
||
|
if isinstance(field_object.field, (ReferenceField, EmbeddedDocumentField)):
|
||
|
_, builded = buildReferenceField(field_object.field, builded)
|
||
|
|
||
|
if _ is not None:
|
||
|
class_list = class_list + list(_)
|
||
|
pn = field_object.field.document_type()
|
||
|
if field not in ignore_fields:
|
||
|
|
||
|
field_list.append(
|
||
|
{"type": "List<{}>".format(pn._class_name), "origin_name": field, "name": to_camel_case(field),
|
||
|
"islist": True, "is_class": True, "required":field_object.required, "class_name": pn._class_name, "autogen": field in autogen_fields})
|
||
|
|
||
|
|
||
|
else:
|
||
|
type = buildFields(field_object.field)
|
||
|
if field not in ignore_fields:
|
||
|
|
||
|
field_list.append({"type": "List<{}>".format(type), "name": to_camel_case(field), "origin_name": field,
|
||
|
"islist": True, "originType": field_object.field, "required":field_object.required, "autogen": field in autogen_fields,"choices":field_object.field.choices})
|
||
|
|
||
|
else:
|
||
|
type = buildFields(field_object)
|
||
|
if field not in ignore_fields:
|
||
|
chc = None
|
||
|
req = False
|
||
|
if field_object is not None:
|
||
|
chc = field_object.choices
|
||
|
req = field_object.required
|
||
|
field_list.append(
|
||
|
{"type": "{}".format(type), "name": to_camel_case(field), "origin_name": field, "islist": False,
|
||
|
"originType": field_object, "autogen": field in autogen_fields,"choices":chc,"required":req})
|
||
|
class_list.append({'class': rClass._class_name, "fields": field_list})
|
||
|
return class_list, builded
|
||
|
|
||
|
f = None
|
||
|
|
||
|
def print(item):
|
||
|
if f:
|
||
|
f.writelines(str(item) + "\n")
|
||
|
|
||
|
def buildFunctionFromJson(fields):
|
||
|
print("\t void fromJson(data) {")
|
||
|
|
||
|
for i in fields:
|
||
|
if i.get('type') != "DateTime":
|
||
|
if not i.get('islist') and not i.get('is_class'):
|
||
|
print("\t\tthis.{} = data[\"{}\"];".format(i.get('name'), i.get("origin_name")))
|
||
|
elif i.get('islist') and not i.get('is_class'):
|
||
|
print("\t\tthis.{}=[];".format(i.get('name')));
|
||
|
print("\t\tdata[\"{}\"].forEach((element)".format(i.get("origin_name")))
|
||
|
print("\t\t{")
|
||
|
print("\t\t\tthis.{}.add(element);".format(i.get('name')))
|
||
|
print("\t\t}"
|
||
|
");")
|
||
|
elif not i.get('islist') and i.get('is_class'):
|
||
|
print("\t\tthis.{} = {}();".format(i.get('name'), i.get('class_name')))
|
||
|
print("\t\tthis.{}.fromJson(data[\"{}\"]);".format(i.get('name'), i.get('origin_name')))
|
||
|
else:
|
||
|
print("\t\tthis.{}=[];".format(i.get('name')));
|
||
|
print("\t\tdata[\"{}\"].forEach((element)".format(i.get("origin_name")))
|
||
|
print("\t\t{")
|
||
|
print("\t\t\t{cname} cls = {cname}();".format(cname=i.get('class_name')))
|
||
|
print("\t\t\tcls.fromJson(data[\"{}\"]);".format(i.get('origin_name')))
|
||
|
|
||
|
print("\t\t\tthis.{}.add(cls);".format(i.get('name')))
|
||
|
print("\t\t}"
|
||
|
");")
|
||
|
|
||
|
print("\t}")
|
||
|
|
||
|
|
||
|
def exportJson(fields):
|
||
|
print("\tMap<String,dynamic> toJson() {")
|
||
|
print("\t\tMap<String,dynamic> output = {};")
|
||
|
for i in fields:
|
||
|
if i.get('type') != "DateTime":
|
||
|
if not i.get('islist') and not i.get('is_class'):
|
||
|
print("\t\toutput[\"{}\"] = this.{};".format(i.get('origin_name'), i.get("name")))
|
||
|
elif i.get('islist') and not i.get('is_class'):
|
||
|
print("\t\toutput[\"{}\"] = [];".format(i.get('origin_name')))
|
||
|
print("\t\tthis.{}.forEach((element) => output[\"{}\"].add(element));".format(i.get('name'),i.get('origin_name')))
|
||
|
elif i.get('islist') and i.get('is_class'):
|
||
|
print("\t\toutput[\"{}\"] = [];".format(i.get('origin_name')))
|
||
|
print("\t\tthis.{}.forEach((element) => output[\"{}\"].add(element.toJson()));".format(i.get('name'),
|
||
|
i.get('origin_name')))
|
||
|
elif not i.get('islist') and i.get('is_class'):
|
||
|
print("\t\toutput[\"{}\"] = this.{}.toJson();".format(i.get('origin_name'),i.get('name')))
|
||
|
print("\t\treturn output;")
|
||
|
print("\t}")
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
def mainBuilder(classlist):
|
||
|
global f
|
||
|
blist = []
|
||
|
for cls in classlist:
|
||
|
data = build_class(cls,blist)
|
||
|
blist = blist + data[1]
|
||
|
for i in data[0]:
|
||
|
f = open('flutter_out/{}.dart'.format(i.get('class')),"w")
|
||
|
print("import 'package:scoped_model/scoped_model.dart';")
|
||
|
print("class {} extends Model ".format(i.get('class')))
|
||
|
print("{")
|
||
|
for field in i.get('fields'):
|
||
|
print("\t {} {};".format(field.get('type'), field.get('name')))
|
||
|
print("")
|
||
|
print("\t// Build Functions")
|
||
|
print("\t// ")
|
||
|
buildFunctionFromJson(i.get('fields'))
|
||
|
exportJson(i.get('fields'))
|
||
|
print("}")
|
||
|
if __name__ == '__main__':
|
||
|
import os
|
||
|
os.chdir('../')
|
||
|
print(os.getcwd())
|
||
|
mainBuilder([User, Payments, Account])
|