From fcb477d7eab1afffd73b53fdb53eb4d63167b82c Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 12 Aug 2025 15:48:55 +0800 Subject: [PATCH] bugfix --- models/ragprogram.xlsx | Bin 0 -> 18376 bytes rag/ragprogram.py | 46 +++++++++++++++++++++++ wwwroot/programs.ui | 81 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 models/ragprogram.xlsx create mode 100644 rag/ragprogram.py create mode 100644 wwwroot/programs.ui diff --git a/models/ragprogram.xlsx b/models/ragprogram.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..624b60171df915b6c5777090cec2a6441917356d GIT binary patch literal 18376 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 Pq5{DJB7lW_KS%!$8f8dr literal 0 HcmV?d00001 diff --git a/rag/ragprogram.py b/rag/ragprogram.py new file mode 100644 index 0000000..81605ef --- /dev/null +++ b/rag/ragprogram.py @@ -0,0 +1,46 @@ +from appPublic.timeUtils import curDateString, dateadd +from ahserver.serverenv import get_serverenv + +def set_program(request, program_type, quota): + db = DBPools() + dbname = get_serverenv('get_module_dbname')('rag') + async with db.sqlorContext(dbname) as sor: + u = await get_session_userinfo(request) + sql="select * from ragquote where orgid = ${orgid}$ order by enabled_date" + qs = await sor.sqlExe(sql, {'orgid': u.userorgid}) + today = curDateString() + if len(qs) == 0: + if params_kw.program_type == 'free': + expired_date = dateadd(today, months=1) + else: + expired_date = '9999-12-31' + ns = { + "id": uuid(), + "orgid": u.userorgid, + "enabled_date": today, + "expired_date": expired_date, + 'quota': params_kw.quota + } + await sor.C('ragquota', ns) + else: + lastq = qs[-1] + lastq.expired_date = today + await sor.U('ragquote', lastq.copy()) + ns = { + "id": uuid(), + "orgid": u.userorgid, + "enabled_date": today, + "expired_date": expired_date, + 'quota': params_kw.quota + } + await sor.C('ragquota', ns) + + +def get_programs(request): + db = DBPools() + dbname = get_serverenv('get_module_dbanme')('rag') + async with db.sqlorContext(dbname) as sor: + recs = await sor.R('ragprogram', {}) + return recs + return [] + diff --git a/wwwroot/programs.ui b/wwwroot/programs.ui new file mode 100644 index 0000000..bf22bac --- /dev/null +++ b/wwwroot/programs.ui @@ -0,0 +1,81 @@ +{ + "widgettype":"DynamicColumn", + "options":{ + "width":"100%" + "height":"100%" + }, + "subwidgets":[ +{% for p in get_rag_programs() %} + { + "widgettype":"VBox", + "options":{ + "css":"card", + "width":"25%", + "cheight":10 + }, + "subwidgets":[ + { + "widgettype":"Title5", + "options":{ + "otext":"{{p.name}}" + "i18n":true, + "wrap":true, + "halign":"center", + "cheight":2 + } + }, + { + "widgettype":"text", + "options":{ + "otext":"{{p.description}}", + "i18n":true, + "wrap":true, + "halign":"left", + "cheight":2 + } + }, + { + "widgettype":"HBox", + "options":{ + "height":1.5 + }, + "subwidgets":[ + { + "widgettype":"text", + "options":{ + "otext":"可用磁盘容量", + "i18n":true + } + }, + { + "widgettype":"text", + "options":{ + "text":"{{p.quota / 1000000}}M" + } + } + ] + } + ], + "binds":[ + { + "wid":"self", + "event":"click", + "actiontype":"urlwidget", + "target":"PopupWindow", + "popup_options":{ + "anchor":"cc", + "width":"60%", + "height":"60%" + } + "options":{ + "params":{ + "selected_program":"p.id" + }, + "url":"{{entire_url('./program_selected.dspy')}}" + } + } + ] + } +{% endfor %} + ] +}