mirror of
https://github.com/haiwen/seahub.git
synced 2025-04-28 03:10:45 +00:00
Optimize dir size (#7732)
* add dir size * update * use sql query file md * optimize sql * update sql * exclude special dir * update --------- Co-authored-by: 孙永强 <11704063+s-yongqiang@user.noreply.gitee.com>
This commit is contained in:
parent
e20902279e
commit
38c6ea36ae
@ -6,6 +6,8 @@ import { CellType } from '../../../metadata/constants';
|
|||||||
import { gettext } from '../../../utils/constants';
|
import { gettext } from '../../../utils/constants';
|
||||||
import { MetadataDetails } from '../../../metadata';
|
import { MetadataDetails } from '../../../metadata';
|
||||||
import { useMetadataStatus } from '../../../hooks';
|
import { useMetadataStatus } from '../../../hooks';
|
||||||
|
import { Utils } from '../../../utils/utils';
|
||||||
|
import { SYSTEM_FOLDERS } from '../../../constants';
|
||||||
|
|
||||||
const DirDetails = ({ direntDetail }) => {
|
const DirDetails = ({ direntDetail }) => {
|
||||||
const { enableMetadata, enableMetadataManagement } = useMetadataStatus();
|
const { enableMetadata, enableMetadataManagement } = useMetadataStatus();
|
||||||
@ -13,14 +15,35 @@ const DirDetails = ({ direntDetail }) => {
|
|||||||
return { type: CellType.MTIME, name: gettext('Last modified time') };
|
return { type: CellType.MTIME, name: gettext('Last modified time') };
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const sizeField = useMemo(() => ({ type: 'size', name: gettext('Size') }), []);
|
||||||
|
const filesField = useMemo(() => ({ type: CellType.NUMBER, name: gettext('Files') }), []);
|
||||||
|
let file_count = direntDetail.file_count || 0;
|
||||||
|
let size = Utils.bytesToSize(direntDetail.size);
|
||||||
|
let special_folder = false;
|
||||||
|
if (direntDetail.path !== undefined) {
|
||||||
|
special_folder = SYSTEM_FOLDERS.some(folder => direntDetail.path.startsWith(folder));
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
{enableMetadataManagement && enableMetadata && (
|
||||||
|
<>
|
||||||
|
<DetailItem field={filesField} value={file_count} className="sf-metadata-property-detail-formatter">
|
||||||
|
{special_folder ?
|
||||||
|
<Formatter field={CellType.TEXT} value={'--'} /> :
|
||||||
|
<Formatter field={filesField} value={file_count} />}
|
||||||
|
</DetailItem>
|
||||||
|
<DetailItem field={sizeField} value={size} className="sf-metadata-property-detail-formatter">
|
||||||
|
{special_folder ?
|
||||||
|
<Formatter field={CellType.TEXT} value={'--'} /> :
|
||||||
|
<Formatter field={sizeField} value={size} />}
|
||||||
|
</DetailItem>
|
||||||
|
<MetadataDetails />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
<DetailItem field={lastModifiedTimeField} className="sf-metadata-property-detail-formatter">
|
<DetailItem field={lastModifiedTimeField} className="sf-metadata-property-detail-formatter">
|
||||||
<Formatter field={lastModifiedTimeField} value={direntDetail.mtime} />
|
<Formatter field={lastModifiedTimeField} value={direntDetail.mtime} />
|
||||||
</DetailItem>
|
</DetailItem>
|
||||||
{enableMetadataManagement && enableMetadata && (
|
|
||||||
<MetadataDetails />
|
|
||||||
)}
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -29,7 +29,7 @@ from seahub.base.templatetags.seahub_tags import email2nickname, \
|
|||||||
email2contact_email
|
email2contact_email
|
||||||
from seahub.utils.repo import parse_repo_perm
|
from seahub.utils.repo import parse_repo_perm
|
||||||
from seahub.constants import PERMISSION_INVISIBLE
|
from seahub.constants import PERMISSION_INVISIBLE
|
||||||
|
from seahub.repo_metadata.models import RepoMetadata
|
||||||
from seahub.settings import ENABLE_VIDEO_THUMBNAIL, THUMBNAIL_ROOT, THUMBNAIL_DEFAULT_SIZE
|
from seahub.settings import ENABLE_VIDEO_THUMBNAIL, THUMBNAIL_ROOT, THUMBNAIL_DEFAULT_SIZE
|
||||||
|
|
||||||
from seaserv import seafile_api
|
from seaserv import seafile_api
|
||||||
@ -581,6 +581,7 @@ class DirDetailView(APIView):
|
|||||||
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
dir_obj = seafile_api.get_dirent_by_path(repo_id, path)
|
dir_obj = seafile_api.get_dirent_by_path(repo_id, path)
|
||||||
|
|
||||||
dir_info = {
|
dir_info = {
|
||||||
'repo_id': repo_id,
|
'repo_id': repo_id,
|
||||||
'path': path,
|
'path': path,
|
||||||
@ -589,4 +590,33 @@ class DirDetailView(APIView):
|
|||||||
'permission': permission,
|
'permission': permission,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# metadata enable check
|
||||||
|
metadata = RepoMetadata.objects.filter(repo_id=repo_id).first()
|
||||||
|
if metadata and metadata.enabled:
|
||||||
|
from seafevents.repo_metadata.constants import METADATA_TABLE
|
||||||
|
from seahub.repo_metadata.metadata_server_api import MetadataServerAPI
|
||||||
|
metadata_server_api = MetadataServerAPI(repo_id, request.user.username)
|
||||||
|
try:
|
||||||
|
sql = f"""
|
||||||
|
SELECT
|
||||||
|
COUNT(*) AS file_count,
|
||||||
|
SUM(`{METADATA_TABLE.columns.size.name}`) AS total_size
|
||||||
|
FROM `{METADATA_TABLE.name}`
|
||||||
|
WHERE
|
||||||
|
(`{METADATA_TABLE.columns.is_dir.name}` = False) AND
|
||||||
|
(
|
||||||
|
`{METADATA_TABLE.columns.parent_dir.name}` ILIKE '{path}%' OR
|
||||||
|
`{METADATA_TABLE.columns.parent_dir.name}` = '{path[:-1]}'
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
results = metadata_server_api.query_rows(sql, [])
|
||||||
|
result_row = results.get('results')[0]
|
||||||
|
dir_info['file_count'] = result_row.get('file_count', 0)
|
||||||
|
dir_info['size'] = result_row.get('total_size', 0)
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception(e)
|
||||||
|
error_msg = 'Internal Server Error'
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
|
||||||
return Response(dir_info)
|
return Response(dir_info)
|
||||||
|
Loading…
Reference in New Issue
Block a user