diff --git a/json/folder.json b/json/folder.json new file mode 100644 index 0000000..e46e768 --- /dev/null +++ b/json/folder.json @@ -0,0 +1,64 @@ +{ + "tblname": "folder", + "uitype":"tree", + "title":"目录", + "params":{ + "idField":"id", + "textField":"name", + "typeField":"filetype", + "sortby":"name", + "editable":true, + "browserfields":{ + "alter":{} + }, + "node_typeicons":{ + "pdf": "{{entire_url('/bricks/imgs/pdf.svg')}}", + "txt":"{{entire_url('/bricks/imgs/txt.svg')}}", + "docx":"{{entire_url('/bricks/imgs/docx.svg')}}", + "doc":"{{entire_url('/bricks/imgs/docx.svg')}}", + "pptx":"{{entire_url('/bricks/imgs/pptx.svg')}}", + "ppt":"{{entire_url('/bricks/imgs/pptx.svg')}}", + "xlsx":"{{entire_url('/bricks/imgs/xlsx.svg')}}", + "xls":"{{entire_url('/bricks/imgs/xlsx.svg')}}", + "epub":"{{entire_url('/bricks/imgs/epub.svg')}}", + "csv":"{{entire_url('/bricks/imgs/csv.svg')}}" + }, + "edit_exclouded_fields":["id", "fiid" ], + "get_data_url":"{{entire_url('/rag/get_folder_subs.dspy')}}", + "delete_data_url": "{{entire_url('/rag/delete_folder_or_file.dspy')}}", + "params":{ + "id":"{{params_kw.id or '' }}" + }, + "newdata_params":{ + "fiid":"{{params_kw.id or ''}}" + }, + "parentField":"parentid", + "toolbar":{ + "tools":[ + { + "name":"upload", + "label":"上传文件", + "selected_data": true, + "icon":"{{entire_url('/bricks/imgs/upload.svg')}}" + } + ] + }, + "binds":[ + { + "wid":"self", + "event":"upload", + "actiontype":"urlwidget", + "target":"PopupWindow", + "popup_options":{ + "width":"75%", + "height":"75%", + "icon":"{{entire_url('/bricks/imgs/app.png')}}", + "title":"上传文件" + }, + "options":{ + "url":"{{entire_url('/rag/upload_file.ui')}}" + } + } + ] + } +} diff --git a/json/kdb.json b/json/kdb.json index 14ba05e..36d6821 100644 --- a/json/kdb.json +++ b/json/kdb.json @@ -32,7 +32,7 @@ "title":"文件管理" }, "options":{ - "url":"{{entire_url('/filemgr/folder')}}" + "url":"{{entire_url('/rag/folder')}}" } } ] diff --git a/json/ragquota.json b/json/ragquota.json new file mode 100644 index 0000000..8017538 --- /dev/null +++ b/json/ragquota.json @@ -0,0 +1,12 @@ +{ + "tblname": "ragquota", + "title":"知识库限额", + "params":{ + "logined_userorgid":"orgid", + "browserfields":{ + "exclouded":["id", "orgid"], + "alters":{} + }, + "edit_exclouded_fields":["id", "orgid" ] + } +} diff --git a/json/ragservies.json b/json/ragservies.json deleted file mode 100644 index 8636dfa..0000000 --- a/json/ragservies.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "tblname": "ragservices", - "title":"知识库服务集", - "params":{ - "logined_userorgid":"orgid", - "sortby":"name", - "browserfields":{ - "alters":{} - }, - "edit_exclouded_fields":[], - "toolbar":{ - }, - "binds":[ - ] - } -} diff --git a/models/ragquota.xlsx b/models/ragquota.xlsx new file mode 100644 index 0000000..35a4e3a Binary files /dev/null and b/models/ragquota.xlsx differ diff --git a/rag/folderinfo.py b/rag/folderinfo.py new file mode 100644 index 0000000..2d81804 --- /dev/null +++ b/rag/folderinfo.py @@ -0,0 +1,38 @@ +from appPublic.timeUtils import curDateString +form filemgr.filemgr import FileMgr + +class RagFileMgr(FileMgr): + async def get_folder_ownerid(self, sor): + fiid = self.fiid + recs = await sor.R('kdb', {'id': self.fiid}) + if len(recs) > 0: + return recs[0].orgid + return None + + async def get_organization_quota(self, sor, orgid): + sql = """select a.* from ragquota a, kdb b +where a.orgid = b.orgid + and b.id = ${id}$ + and ${today}$ >= a.enabled_date + and ${today}$ < a.expired_date +""" + recs = await sor.sqlExe(sql, { + 'id': self.id, + 'today': curDateTime() + }) + if len(recs) > 0: + r = recs[0] + return r.quota, r.expired_date + + + async def file_uploaded(self, request, ns, userid): + pass + + async def file_deleted(self, request, recs, userid): + pass + +## usage +# mgr = RagFileMgr(fiid) +# await mgr.add_file(request, params_kw) +# await mgr.delete_file(request, file_id) +## diff --git a/rag/init.py b/rag/init.py index cd2ad78..c521412 100644 --- a/rag/init.py +++ b/rag/init.py @@ -4,7 +4,9 @@ import aiohttp from aiohttp import ClientSession, ClientTimeout import json from .file import file_uploaded, file_deleted +from .folderinfo import RagFileMgr from appPublic.registerfunction import RegisterFunction +from filemgr.filemgr import use_module_patches async def _make_connection_request(action: str, params: dict = None) -> dict: """ @@ -152,4 +154,6 @@ def load_rag(): env.fused_search = fused_search env.list_user_files = list_user_files env.list_all_knowledge_bases = list_all_knowledge_bases - env.docs = docs \ No newline at end of file + env.docs = docs + env.RagFileMgr = RagFileMgr + diff --git a/wwwroot/bricks b/wwwroot/bricks deleted file mode 120000 index 8563a23..0000000 --- a/wwwroot/bricks +++ /dev/null @@ -1 +0,0 @@ -/d/ymq/js/bricks/dist \ No newline at end of file diff --git a/wwwroot/conformed_delete.dspy b/wwwroot/conformed_delete.dspy new file mode 100644 index 0000000..e5be3e8 --- /dev/null +++ b/wwwroot/conformed_delete.dspy @@ -0,0 +1,6 @@ +try: + filemgr = RagFilemgr() + await filemgr.del_folder(request, params_kw.id) + return UiMessage(title='delete folder', message='delete success') +except Exception as e: + return Error(title='delete folder', message='delete failed({e})') diff --git a/wwwroot/delete_folder_or_file.dspy b/wwwroot/delete_folder_or_file.dspy new file mode 100644 index 0000000..0d01dfe --- /dev/null +++ b/wwwroot/delete_folder_or_file.dspy @@ -0,0 +1,29 @@ +orgid = await get_userorgid() +dbname = get_module_dbname('filemgr') +db = DBPools() +async with db.sqlorContext(dbname) as sor: + filemgr = RagFileMgr() + if params_kw.filetype == 'folder': + has_sub = await filemgr.has_sub(sor, params_kw.id) + if has_sub: + return UiComform(title='Delete Conform', + message='This folder has subitem, are you sure to delete it?', binds=[ + { + "wid":"self", + "event":"conformed", + "actiontype":"urlwidget", + "target":"self", + "options":{ + "params":{ + "id":params_kw.id, + "filetype": params_kw.filetype + }, + url: entire_url('conformed_delete.dspy') + } + } + ]) + await filemgr._del_folder(sor, params_kw.id, ownerid) + else: + await filemgr._del_file(sor, params_kw.id, ownerid) + return UiMessage(title='delete file', message='delete success') +return Error(title='delete file', message='delete failed') diff --git a/wwwroot/get_folder_subs.dspy b/wwwroot/get_folder_subs.dspy new file mode 100644 index 0000000..d3e1b9b --- /dev/null +++ b/wwwroot/get_folder_subs.dspy @@ -0,0 +1,5 @@ +# +debug(f'{params_kw=}') +filemgr = RagFileMgr() +f = await filemgr.get_subs( params_kw.id) +return f diff --git a/wwwroot/getallfiles.dspy b/wwwroot/getallfiles.dspy new file mode 100644 index 0000000..ffb1e0e --- /dev/null +++ b/wwwroot/getallfiles.dspy @@ -0,0 +1,9 @@ +kdbid=params_kw.id +filemgr = FileMgr +ret = [] +async for f in filemgr.get_subfiles(request, params_kw): + ret.append({ + "id":f.id, + "filename":f.realpath + }) +return ret diff --git a/wwwroot/upload_file.dspy b/wwwroot/upload_file.dspy new file mode 100644 index 0000000..554feea --- /dev/null +++ b/wwwroot/upload_file.dspy @@ -0,0 +1,6 @@ +fmgr = RagFileMgr() +try: + stat = await fmgr.add_file(request, params_kw) + return UiMessage(title='Add file', message='file add success') +except Exception as e: + return UiError(title='Add file', message=f'file add failed({e})') diff --git a/wwwroot/upload_file.ui b/wwwroot/upload_file.ui new file mode 100644 index 0000000..005db6a --- /dev/null +++ b/wwwroot/upload_file.ui @@ -0,0 +1,33 @@ +{ + "widgettype":"Form", + "options":{ + "fields":[ + { + "name":"folderid", + "uitype":"hide", + "value":"{{params_kw.id}}" + }, + { + "name":"fiid", + "uitype":"hide", + "value":"{{params_kw.fiid}}" + }, + { + "name":"upfile", + "uitype":"file", + "label":"上传文件" + } + ] + }, + "binds":[ + { + "wid":"self", + "event":"submit", + "actiontype":"urlwidget", + "target":"self", + "options":{ + "url":"{{entire_url('./upload_file.dspy')}}" + } + } + ] +}