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..6a3e379 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') @@ -17,99 +17,127 @@ 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() 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 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 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): - 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'] - 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): + 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) - 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) + 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): + 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): 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.D('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 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 index cb4d36b..c9fb694 100644 --- a/json/folder.json +++ b/json/folder.json @@ -1,11 +1,11 @@ { - "tblname": "permission", + "tblname": "folder", "uitype":"tree", - "title":"权限", + "title":"目录", "params":{ "idField":"id", - "textField":"path", - "sortby":"path", + "textField":"name", + "sortby":"name", "editable":true, "browserfields":{ "alters":{} @@ -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')}}" + } + } ] } - } diff --git a/json/folderinfo.json b/json/folderinfo.json index d3b9cec..2f6612e 100644 --- a/json/folderinfo.json +++ b/json/folderinfo.json @@ -1,20 +1,21 @@ { - "tblname": "users", + "tblname": "folderinfo", "title":"目录信息", "params": { "sortby":"name", + "logined_userorgid":"orgid", "browserfields": { - "exclouded": ["id"], - "alters": {} + "exclouded": ["id", "biztype", "orgid" ], + "cwidth": {} }, "editexclouded": [ - "id" + "id", "orgid" ], "subtables": [ { - "field":"userid", - "title":"用户角色", - "subtable":"userrole" + "field":"fiid", + "title":"目录", + "subtable":"folder" } ] } 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