xls2ddl/singletree.py
2025-07-12 10:08:00 +08:00

139 lines
4.0 KiB
Python

import os
import sys
import codecs
import json
from appPublic.dictObject import DictObject
from xlsxData import xlsxFactory
from appPublic.folderUtils import listFile, _mkdir
from appPublic.myTE import MyTemplateEngine
from tmpls import data_browser_tmpl, get_data_tmpl, data_new_tmpl, data_update_tmpl, data_delete_tmpl
from xls2crud import build_dbdesc, field_list
from tmpls import data_new_tmpl, data_update_tmpl, data_delete_tmpl
ui_tmpl = """
{
"widgettype":"Tree",
"options":{
"width":"100%",
"height":"100%",
{% if not notitle %}
{% if title %}
"title":"{{title}}",
{% else %}
"title":"{{summary[0].title}}",
{% endif %}
{% endif %}
{% if description %}
"description":"{{description}}",
{% endif %}
{% if toolbar %}
"toolbar":{{json.dumps(toolbar, ensure_ascii=False)}},
{% endif %}
{% if editable %}
"editable":{
"fields":{{edit_fields_str}},
"add_url":{%- raw -%}"{{entire_url('./new_{%- endraw -%}{{tblname}}{%- raw -%}.dspy')}}",{%- endraw %}
"update_url":{%- raw -%}"{{entire_url('./update_{%- endraw -%}{{tblname}}{%- raw -%}.dspy')}}",{%- endraw %}
"delete_url":{%- raw -%}"{{entire_url('./delete_{%- endraw -%}{{tblname}}{%- raw -%}.dspy')}}"{%- endraw %}
},
{% endif %}
{% if checkField %}
"checkField":"{{checkField}}",
{% endif %}
"parentField":"{{parentField}}",
"idField":"{{idField}}",
"textField":"{{textField}}",
"dataurl":{%- raw -%}"{{entire_url('./get_{%- endraw -%}{{tblname}}{%- raw -%}.dspy')}}"{%- endraw %}
}
{% if binds %}
,"binds":{{json.dumps(binds, indent=4, ensure_ascii=False)}}
{% endif %}
}
"""
get_nodes_tmpl = """
ns = params_kw.copy()
sql = '''select * from {{tblname}} where 1 = 1'''
id = ns.get('{{idField}}')
if id:
sql += " and {{parentField}} = ${id}$"
else:
sql += " and {{parentField}} is null"
sql += " order by {{textField}} "
db = DBPools()
dbname = get_module_dbname('{{modulename or ''}}')
async with db.sqlorContext(dbname) as sor:
r = await sor.sqlExe(sql, ns)
return r
return []
"""
def gen_tree_ui(d, pat):
e = MyTemplateEngine([])
s = e.renders(ui_tmpl, d)
with open(os.path.join(pat, f'index.ui'), 'w') as f:
f.write(s)
def gen_delete_nodedata(d, pat):
e = MyTemplateEngine([])
s = e.renders(data_delete_tmpl, d)
with open(os.path.join(pat, f'delete_{d.tblname}.dspy'), 'w') as f:
f.write(s)
def gen_update_nodedata(d, pat):
e = MyTemplateEngine([])
s = e.renders(data_update_tmpl, d)
with open(os.path.join(pat, f'update_{d.tblname}.dspy'), 'w') as f:
f.write(s)
def gen_new_nodedata(d, pat):
e = MyTemplateEngine([])
s = e.renders(data_new_tmpl, d)
with open(os.path.join(pat, f'new_{d.tblname}.dspy'), 'w') as f:
f.write(s)
def gen_get_nodedata(d, pat):
e = MyTemplateEngine([])
s = e.renders(get_nodes_tmpl, d)
with open(os.path.join(pat, f'get_{d.tblname}.dspy'), 'w') as f:
f.write(s)
def build_tree_ui(tree_data, dbdesc):
outdir = tree_data.output_dir
_mkdir(outdir)
tbldesc = dbdesc[tree_data.tblname].copy()
tbldesc = DictObject(**tbldesc)
tbldesc.tblname = tree_data.tblname
tbldesc.update(tree_data.params)
exclouds = tbldesc.edit_exclouded_fields or []
if tbldesc.idField not in exclouds:
exclouds.append(tbldesc.idField)
if tbldesc.parentField not in exclouds:
exclouds.append(tbldesc.parentField)
tbldesc.edit_fields_str = json.dumps([ f for f in field_list(tbldesc) if f.name not in exclouds ],
indent=4, ensure_ascii=False)
gen_tree_ui(tbldesc, outdir)
gen_get_nodedata(tbldesc, outdir)
gen_new_nodedata(tbldesc, outdir)
gen_update_nodedata(tbldesc, outdir)
gen_delete_nodedata(tbldesc, outdir)
def main(dbdesc, outdir, modulename, fn):
with codecs.open(fn, 'r', 'utf-8') as f:
gen(dbdesc, outdir, modulename, f.read())
def main(dbdesc, outdir, modulename, fn):
with codecs.open(fn, 'r', 'utf-8') as f:
gen(dbdesc, outdir, modulename, f.read())
if __name__ == '__main__':
if len(sys.argv) < 4:
print(f'{sys.argv[0]} model_path outpath modelname tree_desc_file ...')
sys.exit(1)
dbdesc = build_dbdesc(sys.argv[1])
outdir = sys.argv[2]
modulename = sys.argv[3]
for f in sys.argv[4:]:
main(dbdesc, outdir, modulename, f)