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,99 +17,127 @@ 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:
ns = { return await self.sor_get_bizinfo_nodes(sor, request)
'orgid':usrinfo.userorgid,
'biztype':self.biztype
}
recs = await sor.R('folderinfo', ns)
return recs
return [] return []
async def add_bizinfo_node(self, request, ns): async def sor_get_bizinfo_nodes(self, sor, request):
userinfo = await get_session_userinfo(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):
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:
ns1['orgid'] = userinfo.userorgid, return await self.sor_delete_bizinfo_node(self, sor, request, ns)
ns1['biztype'] = self.biztype
ns1['id'] = ns['id']
await sor.D('folderinfo', ns1)
return True
return False return False
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): 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:
ns1['orgid'] = userinfo.userorgid, return self.sor_update_bizinfo_node(sor, request, ns)
ns1['biztype'] = self.biztype return False
ns1['id'] = ns['id']
recs = await sor.R('folderinfo', ns1)
if len(recs) > 0:
await sor.U('folderinfo', ns1)
return True
return return
async def add_folder(self, request, ns): async def sor_update_bizinfo_node(self, sor, request, ns):
userinfo = await get_session_userinfo(request) userinfo = await get_session_userinfo(request)
dbname = get_dbname() ns1['orgid'] = userinfo.userorgid,
db = DBPools() ns1['biztype'] = self.biztype
async with db.sqlorContext(dbname) as sor: ns1['id'] = ns['id']
ns1['orgid'] = userinfo.userorgid, recs = await sor.R('folderinfo', ns1)
ns1['biztype'] = self.biztype if len(recs) > 0:
ns1['id'] = ns['id'] await sor.U('folderinfo', ns1)
await sor.D('folderinfo', ns1)
return True return True
return False return False
async def add_folder(self, request, ns):
dbname = get_dbname()
db = DBPools()
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['biztype'] = self.biztype
ns1['id'] = ns['id']
await sor.C('folderinfo', ns1)
return True
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 (
ns = { select unique a.* from folder a left join folder b on a.id = b.par
'fid':fid, entid where b.id is not NULL
'fiid':fiid, ) as y
'orgid':userinfo.userorgid, on x.id = y.id
'biztype':self.biztype """
} ns = {
recs = await sor.sqlExe(sql, ns) 'fid':fid,
return recs 'fiid':fiid,
await sor.D('folderinfo', ns1) 'orgid':userinfo.userorgid,
return [] 'biztype':self.biztype
}
recs = await sor.sqlExe(sql, ns)
return recs
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:
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 from folderinfo a, file b
where a.id = ${fiid}$ where a.id = ${fiid}$
and b.folderid = ${fid}$ and b.folderid = ${fid}$
@ -117,18 +145,25 @@ where a.id = ${fiid}$
and b.userid = ${userid}$ and b.userid = ${userid}$
and a.biztype = ${biztype}$ and a.biztype = ${biztype}$
order by name""" order by name"""
ns = { ns = {
'fid':fid, 'fid':fid,
'fiid':fiid, 'fiid':fiid,
'userid':userinfo.userid, 'userid':userinfo.userid,
'orgid':userinfo.userorgid, 'orgid':userinfo.userorgid,
'biztype':self.biztype 'biztype':self.biztype
} }
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,41 +178,32 @@ 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() sql = """select a.id as fiid, b.*
db = DBPools()
async with db.sqlorContext(dbname) as sor:
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}$
and b.id = ${fid}$ and b.id = ${fid}$
and a.orgid = ${orgid} and a.orgid = ${orgid}
and b.userid = ${userid}$ and b.userid = ${userid}$
and a.biztype = ${biztype}$""" and a.biztype = ${biztype}$"""
ns = { ns = {
'fid':fid, 'fid':fid,
'fiid':fiid, 'fiid':fiid,
'userid':userinfo.userid, 'userid':userinfo.userid,
'orgid':userinfo.userorgid, 'orgid':userinfo.userorgid,
'biztype':self.biztype 'biztype':self.biztype
} }
recs = await sor.sqlExe(sql, ns) recs = await sor.sqlExe(sql, ns)
if len(recs) > 0: if len(recs) > 0:
await sor.D('file', {'id': fid}) await sor.D('file', {'id': fid})
return True return True
return False return False

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