From bc3ecf7fd5b762ea603df9b55238dfb7ddc3c3e5 Mon Sep 17 00:00:00 2001 From: ymq1 Date: Thu, 26 Jun 2025 17:00:47 +0800 Subject: [PATCH 1/5] bugfix --- json/build.sh | 3 +++ json/folder.json | 21 +++++++++++++++++++++ json/folderinfo.json | 22 ++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100755 json/build.sh create mode 100644 json/folder.json create mode 100644 json/folderinfo.json diff --git a/json/build.sh b/json/build.sh new file mode 100755 index 0000000..23fab8d --- /dev/null +++ b/json/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/bash + +xls2ui -m ../models -o ../wwwroot filemgr *.json diff --git a/json/folder.json b/json/folder.json new file mode 100644 index 0000000..e8287f6 --- /dev/null +++ b/json/folder.json @@ -0,0 +1,21 @@ +{ + "tblname": "folder", + "uitype":"tree", + "title":"目录", + "params":{ + "idField":"id", + "textField":"name", + "sortby":"name", + "editable":true, + "browserfields":{ + "alters":{} + }, + "edit_exclouded_fields":[], + "parentField":"parentid", + "toolbar":{ + }, + "binds":[ + ] + } + +} diff --git a/json/folderinfo.json b/json/folderinfo.json new file mode 100644 index 0000000..2f6612e --- /dev/null +++ b/json/folderinfo.json @@ -0,0 +1,22 @@ +{ + "tblname": "folderinfo", + "title":"目录信息", + "params": { + "sortby":"name", + "logined_userorgid":"orgid", + "browserfields": { + "exclouded": ["id", "biztype", "orgid" ], + "cwidth": {} + }, + "editexclouded": [ + "id", "orgid" + ], + "subtables": [ + { + "field":"fiid", + "title":"目录", + "subtable":"folder" + } + ] + } +} From 0832515229a28cfc38ea9873bf8f32ee18e7f41e Mon Sep 17 00:00:00 2001 From: ymq1 Date: Thu, 26 Jun 2025 18:06:15 +0800 Subject: [PATCH 2/5] bugfix --- filemgr/__init__.py | 0 filemgr/filemgr.py | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 filemgr/__init__.py diff --git a/filemgr/__init__.py b/filemgr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/filemgr/filemgr.py b/filemgr/filemgr.py index 35ead4d..d66d812 100644 --- a/filemgr/filemgr.py +++ b/filemgr/filemgr.py @@ -37,7 +37,7 @@ class FileMgr: ns['biztype'] = self.biztype ns['id'] = getID() ns['cur_size'] = 0 - ns['max_size'] = await get_params(sor, userinfo.userid, 'folder_max_size); + ns['max_size'] = await get_params(sor, userinfo.userid, 'folder_max_size'); await sor.C('folderinfo', ns) return True return False @@ -66,7 +66,7 @@ class FileMgr: if len(recs) > 0: await sor.U('folderinfo', ns1) return True - return return + return False async def add_folder(self, request, ns): userinfo = await get_session_userinfo(request) @@ -76,7 +76,7 @@ class FileMgr: ns1['orgid'] = userinfo.userorgid, ns1['biztype'] = self.biztype ns1['id'] = ns['id'] - await sor.D('folderinfo', ns1) + await sor.C('folderinfo', ns1) return True return False @@ -148,11 +148,11 @@ where id = ${fiid}$ dbname = get_dbname() db = DBPools() async with db.sqlorContext(dbname) as sor: - sql = """select * from folder + sql = """select * from folder""" ns1['orgid'] = userinfo.userorgid, ns1['biztype'] = self.biztype ns1['id'] = ns['id'] - await sor.D('folderinfo', ns1) + await sor.C('folderinfo', ns1) return True return False From ba17fa970348bfa7761e7b5e92a6a0202bcef540 Mon Sep 17 00:00:00 2001 From: ymq1 Date: Thu, 26 Jun 2025 18:34:17 +0800 Subject: [PATCH 3/5] bugfix --- filemgr/filemgr.py | 6 +++--- pyproject.toml | 4 ++++ setup.cfg | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 pyproject.toml create mode 100644 setup.cfg diff --git a/filemgr/filemgr.py b/filemgr/filemgr.py index d66d812..6d8d28f 100644 --- a/filemgr/filemgr.py +++ b/filemgr/filemgr.py @@ -1,10 +1,10 @@ from traceback import format_exc from ahserver.serverenv import get_serverenv -from ahserver.auth_api import get_userinfo +from ahserver.auth_api import get_session_userinfo from sqlor.dbpools import DBPools from appPublic.uniqueID import getID from appPublic.log import debug, error, exception -from appbase.params import get_parmas +# from appbase.params import get_parmas def get_dbname(): f = get_serverenv('get_module_dbname') @@ -37,7 +37,7 @@ class FileMgr: ns['biztype'] = self.biztype ns['id'] = getID() ns['cur_size'] = 0 - ns['max_size'] = await get_params(sor, userinfo.userid, 'folder_max_size'); + # ns['max_size'] = await get_params(sor, userinfo.userid, 'folder_max_size'); await sor.C('folderinfo', ns) return True return False diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..59514a1 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,4 @@ +[build-system] +requires = ["setuptools>=61", "wheel"] +build-backend = "setuptools.build_meta" + diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..08a653b --- /dev/null +++ b/setup.cfg @@ -0,0 +1,15 @@ +[metadata] +name=filemgr +version = 0.0.1 +description = A folder management package +author = "yu moqing" +author_email = "yumoqing@gmail.com" +readme = "README.md" +license = "MIT" +[options] +packages = find: +requires-python = ">=3.8" +install_requires = + apppublic + sqlor + ahserver From a3168d6524df1225114188698c8701f816293ce2 Mon Sep 17 00:00:00 2001 From: ymq1 Date: Fri, 27 Jun 2025 15:09:26 +0800 Subject: [PATCH 4/5] bugfix --- json/folder.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/json/folder.json b/json/folder.json index e8287f6..c9fb694 100644 --- a/json/folder.json +++ b/json/folder.json @@ -13,9 +13,28 @@ "edit_exclouded_fields":[], "parentField":"parentid", "toolbar":{ + "tools":[ + { + "name":"upload", + "label":"上传文件", + "icon":"{{entire_url('/bricks/imgs/upload.svg')}}" + } + ] }, "binds":[ + { + "wid":"upload", + "event":"upload", + "actiontype":"urlwidget", + "target":"PopupWindow", + "popupwindow_options":{ + "icon":"{{entire_url('/bricks/imgs/app.png')}}", + "title":"上传文件" + }, + "options":{ + "url":"{{entire_url('/filemgr/upload_file.ui')}}" + } + } ] } - } From 22a028d59908891a38c0b756d41e0c4db43ca513 Mon Sep 17 00:00:00 2001 From: ymq1 Date: Sat, 28 Jun 2025 16:30:10 +0800 Subject: [PATCH 5/5] bugfix --- filemgr/filemgr.py | 188 ++++++++++++++++++++++++++------------------- 1 file changed, 107 insertions(+), 81 deletions(-) diff --git a/filemgr/filemgr.py b/filemgr/filemgr.py index 6d8d28f..6a3e379 100644 --- a/filemgr/filemgr.py +++ b/filemgr/filemgr.py @@ -17,22 +17,28 @@ class FileMgr: async def get_bizinfo_nodes(self, request): db = DBPools() - userinfo = await get_session_userinfo(request) dbname = get_dbname() async with db.sqlorContext(dbname) as sor: - ns = { - 'orgid':usrinfo.userorgid, - 'biztype':self.biztype - } - recs = await sor.R('folderinfo', ns) - return recs + return await self.sor_get_bizinfo_nodes(sor, request) return [] + + async def sor_get_bizinfo_nodes(self, sor, request): + userinfo = await get_session_userinfo(request) + ns = { + 'orgid':usrinfo.userorgid, + 'biztype':self.biztype + } + recs = await sor.R('folderinfo', ns) + return recs async def add_bizinfo_node(self, request, ns): - userinfo = await get_session_userinfo(request) dbname = get_dbname() db = DBPools() async with db.sqlorContext(dbname) as sor: + return await self.sor_add_bizinfo_node(sor,request, ns) + return False + async def sor_add_bizinfo_node(self, sor, request, ns): + userinfo = await get_session_userinfo(request) ns['orgid'] = userinfo.userorgid, ns['biztype'] = self.biztype ns['id'] = getID() @@ -40,76 +46,98 @@ class FileMgr: # ns['max_size'] = await get_params(sor, userinfo.userid, 'folder_max_size'); await sor.C('folderinfo', ns) return True - return False async def delete_bizinfo_node(self, request, ns): - userinfo = await get_session_userinfo(request) dbname = get_dbname() db = DBPools() async with db.sqlorContext(dbname) as sor: - ns1['orgid'] = userinfo.userorgid, - ns1['biztype'] = self.biztype - ns1['id'] = ns['id'] - await sor.D('folderinfo', ns1) - return True + return await self.sor_delete_bizinfo_node(self, sor, request, ns) return False - async def update_bizinfo_node(self, request, ns): + async def sor_delete_bizinfo_node(self, sor, request, ns): userinfo = await get_session_userinfo(request) + ns1['orgid'] = userinfo.userorgid, + ns1['biztype'] = self.biztype + ns1['id'] = ns['id'] + await sor.D('folderinfo', ns1) + return True + + async def update_bizinfo_node(self, request, ns): dbname = get_dbname() db = DBPools() async with db.sqlorContext(dbname) as sor: - ns1['orgid'] = userinfo.userorgid, - ns1['biztype'] = self.biztype - ns1['id'] = ns['id'] - recs = await sor.R('folderinfo', ns1) - if len(recs) > 0: - await sor.U('folderinfo', ns1) - return True + return self.sor_update_bizinfo_node(sor, request, ns) + return False + + async def sor_update_bizinfo_node(self, sor, request, ns): + userinfo = await get_session_userinfo(request) + ns1['orgid'] = userinfo.userorgid, + ns1['biztype'] = self.biztype + ns1['id'] = ns['id'] + recs = await sor.R('folderinfo', ns1) + if len(recs) > 0: + await sor.U('folderinfo', ns1) + return True return False async def add_folder(self, request, ns): - userinfo = await get_session_userinfo(request) dbname = get_dbname() db = DBPools() async with db.sqlorContext(dbname) as sor: - ns1['orgid'] = userinfo.userorgid, - ns1['biztype'] = self.biztype - ns1['id'] = ns['id'] - await sor.C('folderinfo', ns1) - return True + return await self.sor_add_folder(sor, request, ns) return False + async def sor_add_folder(self, sor, request, ns): + userinfo = await get_session_userinfo(request) + ns1['orgid'] = userinfo.userorgid, + ns1['biztype'] = self.biztype + ns1['id'] = ns['id'] + await sor.C('folderinfo', ns1) + return True async def get_subfolder(self, request, fid, fiid): userinfo = await get_session_userinfo(request) dbname = get_dbname() db = DBPools() async with db.sqlorContext(dbname) as sor: - sql = """select a.id as fiid, b.* + return await self.sor_get_subfolder(sor, request, fid, fiid) + return [] + + async def sor_get_subfolder(self, sor, request, fid, fiid): + sql = """select x.*, 'folder' as rtype, +case when y.id is null then 1 +else 0 end as is_left +from (select a.id as fiid, b.* from folderinfo a, folder b where a.id = ${fiid}$ and b.fiid = a.id and b.parentid = ${fid}$ and a.orgid = ${orgid}$ and a.biztype = ${biztype}$ -order by name""" - ns = { - 'fid':fid, - 'fiid':fiid, - 'orgid':userinfo.userorgid, - 'biztype':self.biztype - } - recs = await sor.sqlExe(sql, ns) - return recs - await sor.D('folderinfo', ns1) - return [] - +order by name) as x left join ( +select unique a.* from folder a left join folder b on a.id = b.par +entid where b.id is not NULL +) as y +on x.id = y.id +""" + ns = { + 'fid':fid, + 'fiid':fiid, + 'orgid':userinfo.userorgid, + 'biztype':self.biztype + } + recs = await sor.sqlExe(sql, ns) + return recs + async def get_files(self, request, fid, fiid): - userinfo = await get_session_userinfo(request) dbname = get_dbname() db = DBPools() async with db.sqlorContext(dbname) as sor: - sql = """select a.id as fiid, b.* + return await self.sor_get_files(sor, request, fid, fiid) + return [] + + async def sor_get_files(self, sor, request, fid, fiid): + userinfo = await get_session_userinfo(request) + sql = """select a.id as fiid, b.* from folderinfo a, file b where a.id = ${fiid}$ and b.folderid = ${fid}$ @@ -117,18 +145,25 @@ where a.id = ${fiid}$ and b.userid = ${userid}$ and a.biztype = ${biztype}$ order by name""" - ns = { - 'fid':fid, - 'fiid':fiid, - 'userid':userinfo.userid, - 'orgid':userinfo.userorgid, - 'biztype':self.biztype - } - recs = await sor.sqlExe(sql, ns) - return recs - return [] + ns = { + 'fid':fid, + 'fiid':fiid, + 'userid':userinfo.userid, + 'orgid':userinfo.userorgid, + 'biztype':self.biztype + } + recs = await sor.sqlExe(sql, ns) + return recs - async def get_folderinfo(self, sor, userinfo, fiid): + async def get_folderinfo(self, sor, fiid): + dbname = get_dbname() + db = DBPools() + async with db.sqlorContext(dbname) as sor: + return await self.sor_get_folderinfo(sor, request, fid, fiid) + return [] + + async def sor_get_folderinfo(self, sor, fiid): + userinfo = await get_session_userinfo(request) sql = """select * from folderinfo where id = ${fiid}$ and orgid = ${orgid}$ @@ -143,41 +178,32 @@ where id = ${fiid}$ return recs return None - async def add_folder(self, request, ns): - userinfo = await get_session_userinfo(request) - dbname = get_dbname() - db = DBPools() - async with db.sqlorContext(dbname) as sor: - sql = """select * from folder""" - ns1['orgid'] = userinfo.userorgid, - ns1['biztype'] = self.biztype - ns1['id'] = ns['id'] - await sor.C('folderinfo', ns1) - return True - return False - async def delete_file(self, request, fid, fiid): - userinfo = await get_session_userinfo(request) dbname = get_dbname() db = DBPools() async with db.sqlorContext(dbname) as sor: - sql = """select a.id as fiid, b.* + return await self.sor_delete_file(self, sor, request, fid, fiid) + return False + + async def sor_delete_file(self, sor, request, fid, fiid): + userinfo = await get_session_userinfo(request) + sql = """select a.id as fiid, b.* from folderinfo a, file b where a.id = ${fiid}$ and b.id = ${fid}$ and a.orgid = ${orgid} and b.userid = ${userid}$ and a.biztype = ${biztype}$""" - ns = { - 'fid':fid, - 'fiid':fiid, - 'userid':userinfo.userid, - 'orgid':userinfo.userorgid, - 'biztype':self.biztype - } - recs = await sor.sqlExe(sql, ns) - if len(recs) > 0: - await sor.D('file', {'id': fid}) - return True + ns = { + 'fid':fid, + 'fiid':fiid, + 'userid':userinfo.userid, + 'orgid':userinfo.userorgid, + 'biztype':self.biztype + } + recs = await sor.sqlExe(sql, ns) + if len(recs) > 0: + await sor.D('file', {'id': fid}) + return True return False