From cbfa9806d3f3cce15cb436b4ad5396d882c88322 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 8 Aug 2025 17:34:25 +0800 Subject: [PATCH] bugfix --- filemgr/filemgr.py | 68 ++++++++++++++++++------------ json/folder.json | 1 + wwwroot/conformed_delete.dspy | 7 +++ wwwroot/delete_folder_or_file.dspy | 30 +++++++++++++ wwwroot/get_folder_subs.dspy | 2 +- 5 files changed, 80 insertions(+), 28 deletions(-) create mode 100644 wwwroot/conformed_delete.dspy create mode 100644 wwwroot/delete_folder_or_file.dspy diff --git a/filemgr/filemgr.py b/filemgr/filemgr.py index 16956d5..eed8708 100644 --- a/filemgr/filemgr.py +++ b/filemgr/filemgr.py @@ -60,22 +60,40 @@ class FileMgr: return True return False - async def del_file(self, request, params_kw): - fid = params_kw.id + async def del_folder(self, id): db = DBPools() dbname = get_dbname() async with db.sqlorContext(dbname) as sor: - recs = await sor.R('file', {'id': fid}) - if recs: - delrec = recs[0] - await sor.D('file', {'id':fid}) - remain = sor.R('file', {'hashvalue':delrec.hashvalue}) - if not remain: - os.unlink(delrec.realpath) - rf = RegisterFunction() - await rf.exe('filedeleted', delrec) + return await self.del_folder(sor, id) - async def has_sub(self, request, sor, folderid): + async def _del_folder(self, sor, id): + fs = [] + async for f in self._folder_files(sor, id): + fs.append(f) + for f in fs: + if f.filetype == 'folder': + await self._del_folder(sor, f.id) + else: + await self._del_file(sor, f.id) + + async def del_file(self, fid): + db = DBPools() + dbname = get_dbname() + async with db.sqlorContext(dbname) as sor: + return await self._del_file(sor, fid) + + async def _del_file(self, sor, fid): + recs = await sor.R('file', {'id': fid}) + if recs: + delrec = recs[0] + await sor.D('file', {'id':fid}) + remain = sor.R('file', {'hashvalue':delrec.hashvalue}) + if not remain: + os.unlink(delrec.realpath) + rf = RegisterFunction() + await rf.exe('filedeleted', delrec) + + async def has_sub(self, sor, folderid): sql = """select unique a.* from folder a left join folder b on a.id = b.parentid left join file c on a.id=c.folderid @@ -85,35 +103,32 @@ where id=${folderid}$""" return True return False - async def folder_files(self, request, params): - id = params.id + async def folder_files(self, id): db = DBPools() dbanme = get_dbname() async with db.sqlorContext(dbname) as sor: - for r in self._folder_files(sor, request, id): + for r in self._folder_files(sor, id): yield r - async def _folder_files(self, sor, request, id): - recs = await self.sor_get_subfile(sor, request, id) + async def _folder_files(self, sor, id): + recs = await self.sor_get_subfile(sor, id) for r in recs: yield r - folders = await self.sor_get_subfolder(sor, request, id) + folders = await self.sor_get_subfolder(sor, id) for f in folders: - for r in self._folder_files(request, f.id): + for r in self._folder_files(f.id): yield r - async def get_subs(self, request, params): - id = params.id - userinfo = await get_session_userinfo(request) + async def get_subs(self, id): dbname = get_dbname() db = DBPools() async with db.sqlorContext(dbname) as sor: - ret = await self.sor_get_subfolder(sor, request, id) - ret += await self.sor_get_subfile(sor, request, id) + ret = await self.sor_get_subfolder(sor, id) + ret += await self.sor_get_subfile(sor, id) return ret return [] - async def sor_get_subfolder(self, sor, request, fid): + async def sor_get_subfolder(self, sor, fid): sql = """select x.*, 'folder' as filetype, case when y.id is null then 1 else 0 end as is_left @@ -132,8 +147,7 @@ where x.parentid = ${fid}$ recs = await sor.sqlExe(sql, ns) return recs - async def sor_get_subfile(self, sor, request, fid): - userinfo = await get_session_userinfo(request) + async def sor_get_subfile(self, sor, fid): sql = """select *, 1 as is_leaf from file where folderid=${fid}$""" ns = { 'fid':fid diff --git a/json/folder.json b/json/folder.json index 9a51944..c107795 100644 --- a/json/folder.json +++ b/json/folder.json @@ -25,6 +25,7 @@ }, "edit_exclouded_fields":["id", "fiid" ], "get_data_url":"{{entire_url('/filemgr/get_folder_subs.dspy')}}", + "delete_data_url": "{{entire_url('/filemgr/delete_folder_or_file.dspy')}}", "params":{ "id":"{{params_kw.id or '' }}" }, diff --git a/wwwroot/conformed_delete.dspy b/wwwroot/conformed_delete.dspy new file mode 100644 index 0000000..c6614cd --- /dev/null +++ b/wwwroot/conformed_delete.dspy @@ -0,0 +1,7 @@ +dbname = get_module_dbname('filemgr') +db = DBPools() +async with db.sqlorContext(dbname) as sor: + filemgr = Filemgr() + await filemgr._del_folder(sor, params_kw.id) + return UiMessage(title='delete folder', message='delete success') +return Error(title='delete folder', message='delete failed') diff --git a/wwwroot/delete_folder_or_file.dspy b/wwwroot/delete_folder_or_file.dspy new file mode 100644 index 0000000..1149121 --- /dev/null +++ b/wwwroot/delete_folder_or_file.dspy @@ -0,0 +1,30 @@ + +dbname = get_module_nmae('filemgr') +db = DBPools() +async with db.sqlorContext(dbname) as sor: + filemgr = FileMgr() + 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') + } + } + ]) + else: + await filemgr._del_folder(sor, params_kw.id) + else: + await filemgr._del_file(sor, params_kw.id) + 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 index a7c3205..614f5d3 100644 --- a/wwwroot/get_folder_subs.dspy +++ b/wwwroot/get_folder_subs.dspy @@ -1,5 +1,5 @@ # debug(f'{params_kw=}') filemgr = FileMgr() -f = await filemgr.get_subs(request, params_kw) +f = await filemgr.get_subs( params_kw.id) return f