This commit is contained in:
yumoqing 2025-06-30 15:05:55 +08:00
commit 29f9466b22
7 changed files with 168 additions and 100 deletions

0
filemgr/__init__.py Normal file
View File

View File

@ -1,10 +1,10 @@
from traceback import format_exc from traceback import format_exc
from ahserver.serverenv import get_serverenv 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 sqlor.dbpools import DBPools
from appPublic.uniqueID import getID from appPublic.uniqueID import getID
from appPublic.log import debug, error, exception from appPublic.log import debug, error, exception
from appbase.params import get_parmas # from appbase.params import get_parmas
def get_dbname(): def get_dbname():
f = get_serverenv('get_module_dbname') f = get_serverenv('get_module_dbname')
@ -17,48 +17,60 @@ class FileMgr:
async def get_bizinfo_nodes(self, request): async def get_bizinfo_nodes(self, request):
db = DBPools() db = DBPools()
userinfo = await get_session_userinfo(request)
dbname = get_dbname() dbname = get_dbname()
async with db.sqlorContext(dbname) as sor: async with db.sqlorContext(dbname) as sor:
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 = { ns = {
'orgid':usrinfo.userorgid, 'orgid':usrinfo.userorgid,
'biztype':self.biztype 'biztype':self.biztype
} }
recs = await sor.R('folderinfo', ns) recs = await sor.R('folderinfo', ns)
return recs return recs
return []
async def add_bizinfo_node(self, request, ns): async def add_bizinfo_node(self, request, ns):
userinfo = await get_session_userinfo(request)
dbname = get_dbname() dbname = get_dbname()
db = DBPools() db = DBPools()
async with db.sqlorContext(dbname) as sor: 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['orgid'] = userinfo.userorgid,
ns['biztype'] = self.biztype ns['biztype'] = self.biztype
ns['id'] = getID() ns['id'] = getID()
ns['cur_size'] = 0 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) await sor.C('folderinfo', ns)
return True return True
return False
async def delete_bizinfo_node(self, request, ns): async def delete_bizinfo_node(self, request, ns):
userinfo = await get_session_userinfo(request)
dbname = get_dbname() dbname = get_dbname()
db = DBPools() db = DBPools()
async with db.sqlorContext(dbname) as sor: async with db.sqlorContext(dbname) as sor:
return await self.sor_delete_bizinfo_node(self, sor, request, ns)
return False
async def sor_delete_bizinfo_node(self, sor, request, ns):
userinfo = await get_session_userinfo(request)
ns1['orgid'] = userinfo.userorgid, ns1['orgid'] = userinfo.userorgid,
ns1['biztype'] = self.biztype ns1['biztype'] = self.biztype
ns1['id'] = ns['id'] ns1['id'] = ns['id']
await sor.D('folderinfo', ns1) await sor.D('folderinfo', ns1)
return True return True
return False
async def update_bizinfo_node(self, request, ns): async def update_bizinfo_node(self, request, ns):
userinfo = await get_session_userinfo(request)
dbname = get_dbname() dbname = get_dbname()
db = DBPools() db = DBPools()
async with db.sqlorContext(dbname) as sor: async with db.sqlorContext(dbname) as sor:
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['orgid'] = userinfo.userorgid,
ns1['biztype'] = self.biztype ns1['biztype'] = self.biztype
ns1['id'] = ns['id'] ns1['id'] = ns['id']
@ -66,33 +78,47 @@ class FileMgr:
if len(recs) > 0: if len(recs) > 0:
await sor.U('folderinfo', ns1) await sor.U('folderinfo', ns1)
return True return True
return return return False
async def add_folder(self, request, ns): async def add_folder(self, request, ns):
userinfo = await get_session_userinfo(request)
dbname = get_dbname() dbname = get_dbname()
db = DBPools() db = DBPools()
async with db.sqlorContext(dbname) as sor: async with db.sqlorContext(dbname) as sor:
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['orgid'] = userinfo.userorgid,
ns1['biztype'] = self.biztype ns1['biztype'] = self.biztype
ns1['id'] = ns['id'] ns1['id'] = ns['id']
await sor.D('folderinfo', ns1) await sor.C('folderinfo', ns1)
return True return True
return False
async def get_subfolder(self, request, fid, fiid): async def get_subfolder(self, request, fid, fiid):
userinfo = await get_session_userinfo(request) userinfo = await get_session_userinfo(request)
dbname = get_dbname() dbname = get_dbname()
db = DBPools() db = DBPools()
async with db.sqlorContext(dbname) as sor: 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 from folderinfo a, folder b
where a.id = ${fiid}$ where a.id = ${fiid}$
and b.fiid = a.id and b.fiid = a.id
and b.parentid = ${fid}$ and b.parentid = ${fid}$
and a.orgid = ${orgid}$ and a.orgid = ${orgid}$
and a.biztype = ${biztype}$ and a.biztype = ${biztype}$
order by name""" 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 = { ns = {
'fid':fid, 'fid':fid,
'fiid':fiid, 'fiid':fiid,
@ -101,14 +127,16 @@ order by name"""
} }
recs = await sor.sqlExe(sql, ns) recs = await sor.sqlExe(sql, ns)
return recs return recs
await sor.D('folderinfo', ns1)
return []
async def get_files(self, request, fid, fiid): async def get_files(self, request, fid, fiid):
userinfo = await get_session_userinfo(request)
dbname = get_dbname() dbname = get_dbname()
db = DBPools() db = DBPools()
async with db.sqlorContext(dbname) as sor: async with db.sqlorContext(dbname) as sor:
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.* sql = """select a.id as fiid, b.*
from folderinfo a, file b from folderinfo a, file b
where a.id = ${fiid}$ where a.id = ${fiid}$
@ -126,9 +154,16 @@ order by name"""
} }
recs = await sor.sqlExe(sql, ns) recs = await sor.sqlExe(sql, ns)
return recs return recs
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 [] return []
async def get_folderinfo(self, sor, userinfo, fiid): async def sor_get_folderinfo(self, sor, fiid):
userinfo = await get_session_userinfo(request)
sql = """select * from folderinfo sql = """select * from folderinfo
where id = ${fiid}$ where id = ${fiid}$
and orgid = ${orgid}$ and orgid = ${orgid}$
@ -143,24 +178,15 @@ where id = ${fiid}$
return recs return recs
return None return None
async def add_folder(self, request, ns): async def delete_file(self, request, fid, fiid):
userinfo = await get_session_userinfo(request)
dbname = get_dbname() dbname = get_dbname()
db = DBPools() db = DBPools()
async with db.sqlorContext(dbname) as sor: async with db.sqlorContext(dbname) as sor:
sql = """select * from folder return await self.sor_delete_file(self, sor, request, fid, fiid)
ns1['orgid'] = userinfo.userorgid,
ns1['biztype'] = self.biztype
ns1['id'] = ns['id']
await sor.D('folderinfo', ns1)
return True
return False return False
async def delete_file(self, request, fid, fiid): async def sor_delete_file(self, sor, request, fid, fiid):
userinfo = await get_session_userinfo(request) 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.* sql = """select a.id as fiid, b.*
from folderinfo a, file b from folderinfo a, file b
where a.id = ${fiid}$ where a.id = ${fiid}$

3
json/build.sh Executable file
View File

@ -0,0 +1,3 @@
#!/usr/bin/bash
xls2ui -m ../models -o ../wwwroot filemgr *.json

View File

@ -1,11 +1,11 @@
{ {
"tblname": "permission", "tblname": "folder",
"uitype":"tree", "uitype":"tree",
"title":"权限", "title":"目录",
"params":{ "params":{
"idField":"id", "idField":"id",
"textField":"path", "textField":"name",
"sortby":"path", "sortby":"name",
"editable":true, "editable":true,
"browserfields":{ "browserfields":{
"alters":{} "alters":{}
@ -13,9 +13,28 @@
"edit_exclouded_fields":[], "edit_exclouded_fields":[],
"parentField":"parentid", "parentField":"parentid",
"toolbar":{ "toolbar":{
"tools":[
{
"name":"upload",
"label":"上传文件",
"icon":"{{entire_url('/bricks/imgs/upload.svg')}}"
}
]
}, },
"binds":[ "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')}}"
}
}
] ]
} }
} }

View File

@ -1,20 +1,21 @@
{ {
"tblname": "users", "tblname": "folderinfo",
"title":"目录信息", "title":"目录信息",
"params": { "params": {
"sortby":"name", "sortby":"name",
"logined_userorgid":"orgid",
"browserfields": { "browserfields": {
"exclouded": ["id"], "exclouded": ["id", "biztype", "orgid" ],
"alters": {} "cwidth": {}
}, },
"editexclouded": [ "editexclouded": [
"id" "id", "orgid"
], ],
"subtables": [ "subtables": [
{ {
"field":"userid", "field":"fiid",
"title":"用户角色", "title":"目录",
"subtable":"userrole" "subtable":"folder"
} }
] ]
} }

4
pyproject.toml Normal file
View File

@ -0,0 +1,4 @@
[build-system]
requires = ["setuptools>=61", "wheel"]
build-backend = "setuptools.build_meta"

15
setup.cfg Normal file
View File

@ -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