bugfix
This commit is contained in:
parent
74e3148c8a
commit
07f653abc3
@ -1,10 +1,19 @@
|
||||
import os
|
||||
from traceback import format_exc
|
||||
from ahserver.serverenv import get_serverenv
|
||||
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 ahserver.filestorage import FileStorage
|
||||
import hashlib
|
||||
|
||||
def get_file_hash(filepath, algo='sha256', chunk_size=8192):
|
||||
h = hashlib.new(algo)
|
||||
with open(filepath, 'rb') as f:
|
||||
while chunk := f.read(chunk_size):
|
||||
h.update(chunk)
|
||||
return h.hexdigest()
|
||||
|
||||
def get_dbname():
|
||||
f = get_serverenv('get_module_dbname')
|
||||
@ -12,87 +21,57 @@ def get_dbname():
|
||||
return dbname
|
||||
|
||||
class FileMgr:
|
||||
def __init__(self, biztype):
|
||||
self.biztype = biztype
|
||||
|
||||
async def get_bizinfo_nodes(self, request):
|
||||
db = DBPools()
|
||||
dbname = get_dbname()
|
||||
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 = {
|
||||
'orgid':usrinfo.userorgid,
|
||||
'biztype':self.biztype
|
||||
}
|
||||
recs = await sor.R('folderinfo', ns)
|
||||
return recs
|
||||
|
||||
async def add_bizinfo_node(self, request, ns):
|
||||
async def add_file(request, params_kw):
|
||||
fs = FileStorage()
|
||||
webpath = params_kw.upfile
|
||||
realpath = fs.realpath(wwebpath)
|
||||
filesize = os.path.getsize(realpath)
|
||||
hashvalue = get_file_hash(realpath)
|
||||
dbname = get_dbname()
|
||||
u = await get_session_userinfo(request)
|
||||
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');
|
||||
await sor.C('folderinfo', ns)
|
||||
return True
|
||||
|
||||
async def delete_bizinfo_node(self, request, ns):
|
||||
dbname = get_dbname()
|
||||
db = DBPools()
|
||||
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['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:
|
||||
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)
|
||||
recs = await sor.R('file',{'hashvalue': hashvalue})
|
||||
if len(recs) > 0:
|
||||
await sor.U('folderinfo', ns1)
|
||||
return True
|
||||
return False
|
||||
os.unlink(realpath)
|
||||
r = recs[0]
|
||||
webpath = r.webpath
|
||||
realpath = r.realpath
|
||||
ns = {
|
||||
"id": getID(),
|
||||
"folderid": params_kw.fid,
|
||||
"fiid":params_kw.fiid,
|
||||
"name":os.path.basename(params_kw.upfile),
|
||||
"webpath": webpath,
|
||||
"realpath": realpath,
|
||||
"filetpye":params_kw.upfile.split('.')[-1].lower(),
|
||||
"filesize":filesize,
|
||||
"owner": u.userorgid,
|
||||
"hashvalue": hashvalue
|
||||
}
|
||||
await sor.C('file', ns)
|
||||
|
||||
async def add_folder(self, request, ns):
|
||||
dbname = get_dbname()
|
||||
async def del_file(request, fid):
|
||||
db = DBPools()
|
||||
dbname = get_dbname()
|
||||
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)
|
||||
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)
|
||||
|
||||
async def has_sub(request, 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
|
||||
where id=${folderid}$"""
|
||||
recs = await sor.sqlExe(sql, {'folderid':folderid})
|
||||
if recs:
|
||||
return True
|
||||
return False
|
||||
|
||||
async def get_subfolder(self, request, fid, fiid):
|
||||
userinfo = await get_session_userinfo(request)
|
||||
@ -100,110 +79,38 @@ class FileMgr:
|
||||
db = DBPools()
|
||||
async with db.sqlorContext(dbname) as sor:
|
||||
return await self.sor_get_subfolder(sor, request, fid, fiid)
|
||||
return await self.sor_get_subfile(sor, request, fid, fiid)
|
||||
return []
|
||||
|
||||
async def sor_get_subfolder(self, sor, request, fid, fiid):
|
||||
sql = """select x.*, 'folder' as rtype,
|
||||
sql = """select x.*, 'folder' as filetype,
|
||||
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) 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
|
||||
from folder as x left join (
|
||||
select unique a.* from folder a
|
||||
left join folder b on a.id = b.parentid
|
||||
left join file c on a.id=c.folderid
|
||||
where b.id is not null or c.id is n
|
||||
ot null;
|
||||
) as y
|
||||
on x.id = y.id
|
||||
where x.parentid = ${fid}$ and fiid=${fiid}$
|
||||
"""
|
||||
ns = {
|
||||
'fid':fid,
|
||||
'fiid':fiid,
|
||||
'orgid':userinfo.userorgid,
|
||||
'biztype':self.biztype
|
||||
'fiid':fiid
|
||||
}
|
||||
recs = await sor.sqlExe(sql, ns)
|
||||
return recs
|
||||
|
||||
async def get_files(self, request, fid, fiid):
|
||||
dbname = get_dbname()
|
||||
db = DBPools()
|
||||
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):
|
||||
async def sor_get_subfile(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}$
|
||||
and a.orgid = ${orgid}
|
||||
and b.userid = ${userid}$
|
||||
and a.biztype = ${biztype}$
|
||||
order by name"""
|
||||
sql = """select a.*, 1 as is_leaf from file where folderid=${fid}$ and fiid=${fiid}"""
|
||||
ns = {
|
||||
'fid':fid,
|
||||
'fiid':fiid,
|
||||
'userid':userinfo.userid,
|
||||
'orgid':userinfo.userorgid,
|
||||
'biztype':self.biztype
|
||||
'fiid':fiid
|
||||
}
|
||||
recs = await sor.sqlExe(sql, ns)
|
||||
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 []
|
||||
|
||||
async def sor_get_folderinfo(self, sor, fiid):
|
||||
userinfo = await get_session_userinfo(request)
|
||||
sql = """select * from folderinfo
|
||||
where id = ${fiid}$
|
||||
and orgid = ${orgid}$
|
||||
and biztype = ${biztype}$"""
|
||||
ns = {
|
||||
'id':fiid,
|
||||
'orgid':userinfo.userorgid,
|
||||
'biztype':self.biztype
|
||||
}
|
||||
recs = await sor.sqlExe(sql, ns)
|
||||
if len(recs)>0:
|
||||
return recs
|
||||
return None
|
||||
|
||||
async def delete_file(self, request, fid, fiid):
|
||||
dbname = get_dbname()
|
||||
db = DBPools()
|
||||
async with db.sqlorContext(dbname) as sor:
|
||||
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
|
||||
return False
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user