Merge branch 'main' of git.opencomputing.cn:yumoqing/xls2ddl

This commit is contained in:
yumoqing 2026-03-12 21:54:37 +08:00
commit 78d4d2a452
2 changed files with 117 additions and 88 deletions

View File

@ -1,6 +1,6 @@
[metadata]
name=xls2ddl
version = 1.1.1
version = 1.1.2
description = a xlsx file to database ddl converter
author = "yu moqing"
author_email = "yumoqing@gmail.com"

View File

@ -1,8 +1,8 @@
data_browser_tmpl = """
{
"id":"{{tblname}}_tbl",
"widgettype":"Tabular",
"options":{
"widgettype":"Tabular",
"options":{
"width":"100%",
"height":"100%",
{% if not notitle %}
@ -44,7 +44,7 @@ data_browser_tmpl = """
{% if get_data_url %}
"data_url": "{{get_data_url}}",
{% else %}
"data_url":"{%- raw -%}{{entire_url('./get_{%- endraw -%}{{summary[0].name}}{%- raw -%}.dspy')}}",{%- endraw %}
"data_url":"{%- raw -%}{{entire_url('./get_{%- endraw -%}{{summary[0].name}}{%- raw -%}.dspy')}}",{%- endraw %}
{% endif %}
"data_method":"{{data_method or 'GET'}}",
"data_params":{%- raw -%}{{json.dumps(params_kw, indent=4, ensure_ascii=False)}},{%- endraw %}
@ -62,7 +62,7 @@ data_browser_tmpl = """
"editexclouded":{{json.dumps(editexclouded, indent=4, ensure_ascii=False)}},
{% endif %}
"fields":{{fieldliststr}}
},
},
{% if subtables_condition %}
{%- raw -%}{% {%- endraw %}if {{subtables_condition}} {%- raw -%} %}{%- endraw -%}
{% endif %}
@ -72,9 +72,9 @@ data_browser_tmpl = """
{% if subtables_condition %}
{%- raw -%}{% endif %}{%- endraw %}
{% endif %}
"page_rows":160,
"cache_limit":5
}
"page_rows":160,
"cache_limit":5
}
{% if bindsstr %}
,"binds":{{bindsstr}}
{% endif %}
@ -116,11 +116,11 @@ ns['userorgid'] = userorgid
{% endif %}
debug(f'get_{{tblname}}.dspy:{ns=}')
if not ns.get('page'):
ns['page'] = 1
ns['page'] = 1
if not ns.get('sort'):
{% if sortby %}
{% if type(sortby) == type("") %}
ns['sort'] = '{{sortby}}'
ns['sort'] = '{{sortby}}'
{% else %}
ns['sort'] = {{json.dumps(sortby)}}
{% endif %}
@ -157,8 +157,8 @@ debug(f'{sql=}')
db = DBPools()
dbname = get_module_dbname('{{modulename}}')
async with db.sqlorContext(dbname) as sor:
r = await sor.sqlPaging(sql, ns)
return r
r = await sor.sqlPaging(sql, ns)
return r
return {
"total":0,
"rows":[]
@ -166,6 +166,9 @@ return {
"""
data_new_tmpl = """
ns = params_kw.copy()
for k,v in ns.items():
if v == 'NaN' or v == 'null':
ns[k] = None
id = params_kw.id
if not id or len(id) > 32:
id = uuid()
@ -207,32 +210,35 @@ ns['{{logined_userorgid}}'] = userorgid
db = DBPools()
dbname = get_module_dbname('{{modulename}}')
async with db.sqlorContext(dbname) as sor:
r = await sor.C('{{summary[0].name}}', ns.copy())
return {
"widgettype":"Message",
"options":{
r = await sor.C('{{summary[0].name}}', ns.copy())
return {
"widgettype":"Message",
"options":{
"user_data":ns,
"cwidth":16,
"cheight":9,
"title":"Add Success",
"title":"Add Success",
"timeout":3,
"message":"ok"
}
}
"message":"ok"
}
}
return {
"widgettype":"Error",
"options":{
"title":"Add Error",
"widgettype":"Error",
"options":{
"title":"Add Error",
"cwidth":16,
"cheight":9,
"timeout":3,
"message":"failed"
}
"message":"failed"
}
}
"""
data_update_tmpl = """
ns = params_kw.copy()
for k,v in ns.items():
if v == 'NaN' or v == 'null':
ns[k] = None
{% if logined_userid %}
userid = await get_user()
if not userid:
@ -265,39 +271,62 @@ ns['{{logined_userorgid}}'] = userorgid
{% endif %}
{% for f in confidential_fields or [] %}
if params_kw.get('{{f}}'):
ns['{{f}}'] = password_encode(params_kw.get('{{f}}'))
ns['{{f}}'] = password_encode(params_kw.get('{{f}}'))
{% endfor %}
db = DBPools()
dbname = get_module_dbname('{{modulename}}')
async with db.sqlorContext(dbname) as sor:
r = await sor.U('{{summary[0].name}}', ns)
debug('update success');
return {
"widgettype":"Message",
"options":{
"title":"Update Success",
{% if logined_userid or logined_userorgid %}
ns1 = {
{% if logined_userorgid %}
"{{logined_userorgid}}": userorgid,
{% endif %}
{% if logined_userid %}
"{{logined_userid}}": userid,
{% endif %}
"id": params_kw.id
}
recs = await sor.R('{{summary[0].name}}', ns1)
if len(recs) < 1:
return {
"widgettype":"Error",
"options":{
"title":"Update Error",
"cwidth":16,
"cheight":9,
"timeout":3,
"message":"Record no exist or with wrong ownership"
}
}
{% endif %}
r = await sor.U('{{summary[0].name}}', ns)
debug('update success');
return {
"widgettype":"Message",
"options":{
"title":"Update Success",
"cwidth":16,
"cheight":9,
"timeout":3,
"message":"ok"
}
}
"message":"ok"
}
}
return {
"widgettype":"Error",
"options":{
"title":"Update Error",
"widgettype":"Error",
"options":{
"title":"Update Error",
"cwidth":16,
"cheight":9,
"timeout":3,
"message":"failed"
}
"message":"failed"
}
}
"""
data_delete_tmpl = """
ns = {
'id':params_kw['id'],
'id':params_kw['id'],
}
{% if logined_userid %}
userid = await get_user()
@ -332,29 +361,29 @@ ns['{{logined_userorgid}}'] = userorgid
db = DBPools()
dbname = get_module_dbname('{{modulename}}')
async with db.sqlorContext(dbname) as sor:
r = await sor.D('{{summary[0].name}}', ns)
debug('delete success');
return {
"widgettype":"Message",
"options":{
"title":"Delete Success",
r = await sor.D('{{summary[0].name}}', ns)
debug('delete success');
return {
"widgettype":"Message",
"options":{
"title":"Delete Success",
"timeout":3,
"cwidth":16,
"cheight":9,
"message":"ok"
}
}
"message":"ok"
}
}
debug('Delete failed');
return {
"widgettype":"Error",
"options":{
"title":"Delete Error",
"widgettype":"Error",
"options":{
"title":"Delete Error",
"timeout":3,
"cwidth":16,
"cheight":9,
"message":"failed"
}
"message":"failed"
}
}
"""
@ -363,39 +392,39 @@ is_checked = params_kw.get('has_{{relation.param_field}}')
debug(f'{params_kw=}, {is_checked=}')
dbname = get_module_dbname('{{modulename}}')
if is_checked == 'true':
ns = {
"id":uuid(),
"{{relation.param_field}}":params_kw.{{relation.param_field}},
"{{relation.outter_field}}":params_kw.{{relation.outter_field}}
}
db = DBPools();
async with db.sqlorContext(dbname) as sor:
await sor.C('{{tblname}}', ns)
ns = {
"id":uuid(),
"{{relation.param_field}}":params_kw.{{relation.param_field}},
"{{relation.outter_field}}":params_kw.{{relation.outter_field}}
}
db = DBPools();
async with db.sqlorContext(dbname) as sor:
await sor.C('{{tblname}}', ns)
return {
"widgettype":"Message",
"options":{
"title":"Success",
"message":"record add success",
"timeout":2
}
}
return {
"widgettype":"Message",
"options":{
"title":"Success",
"message":"record add success",
"timeout":2
}
}
else:
ns = {
"{{relation.param_field}}":params_kw.{{relation.param_field}},
"{{relation.outter_field}}":params_kw.{{relation.outter_field}}
}
sql = "delete from {{tblname}} where {{relation.param_field}}=" + "${" + "{{relation.param_field}}" + "}$" + " and {{relation.outter_field}}=" + "${" + "{{relation.outter_field}}" + "}$"
db = DBPools()
async with db.sqlorContext(dbname) as sor:
await sor.sqlExe(sql, ns)
ns = {
"{{relation.param_field}}":params_kw.{{relation.param_field}},
"{{relation.outter_field}}":params_kw.{{relation.outter_field}}
}
sql = "delete from {{tblname}} where {{relation.param_field}}=" + "${" + "{{relation.param_field}}" + "}$" + " and {{relation.outter_field}}=" + "${" + "{{relation.outter_field}}" + "}$"
db = DBPools()
async with db.sqlorContext(dbname) as sor:
await sor.sqlExe(sql, ns)
return {
"widgettype":"Message",
"options":{
"title":"Success",
"message":"delete record success",
"timeout":3
}
}
return {
"widgettype":"Message",
"options":{
"title":"Success",
"message":"delete record success",
"timeout":3
}
}
"""