1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-27 23:56:18 +00:00

list device errors by page (#5225)

Co-authored-by: lian <lian@seafile.com>
This commit is contained in:
lian
2022-08-05 09:53:01 +08:00
committed by GitHub
parent 8392120fd4
commit 5708886faa
2 changed files with 72 additions and 7 deletions

View File

@@ -11,6 +11,7 @@ import { Link } from '@reach/router';
import DevicesNav from './devices-nav';
import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import Paginator from '../../../components/paginator';
class Content extends Component {
@@ -18,8 +19,16 @@ class Content extends Component {
super(props);
}
getPreviousPageDeviceErrorsList = () => {
this.props.getDeviceErrorsListByPage(this.props.pageInfo.current_page - 1);
}
getNextPageDeviceErrorsList = () => {
this.props.getDeviceErrorsListByPage(this.props.pageInfo.current_page + 1);
}
render() {
const { loading, errorMsg, items } = this.props;
const { loading, errorMsg, items, pageInfo, curPerPage } = this.props;
if (loading) {
return <Loading />;
} else if (errorMsg) {
@@ -49,6 +58,14 @@ class Content extends Component {
})}
</tbody>
</table>
<Paginator
gotoPreviousPage={this.getPreviousPageDeviceErrorsList}
gotoNextPage={this.getNextPageDeviceErrorsList}
currentPage={pageInfo.current_page}
hasNextPage={pageInfo.has_next_page}
curPerPage={curPerPage}
resetPerPage={this.props.resetPerPage}
/>
</Fragment>
);
return items.length ? table : emptyTip;
@@ -98,15 +115,30 @@ class DeviceErrors extends Component {
loading: true,
errorMsg: '',
devicesErrors: [],
isCleanBtnShown: false
isCleanBtnShown: false,
pageInfo: {},
perPage: 25
};
}
componentDidMount () {
seafileAPI.sysAdminListDeviceErrors().then((res) => {
let urlParams = (new URL(window.location)).searchParams;
const { currentPage = 1, perPage } = this.state;
this.setState({
perPage: parseInt(urlParams.get('per_page') || perPage),
currentPage: parseInt(urlParams.get('page') || currentPage)
}, () => {
this.getDeviceErrorsListByPage(this.state.currentPage);
});
}
getDeviceErrorsListByPage = (page) => {
let per_page = this.state.perPage;
seafileAPI.sysAdminListDeviceErrors(page, per_page).then((res) => {
this.setState({
loading: false,
devicesErrors: res.data,
devicesErrors: res.data.device_errors,
pageInfo: res.data.page_info,
isCleanBtnShown: res.data.length > 0
});
}).catch((error) => {
@@ -131,6 +163,13 @@ class DeviceErrors extends Component {
});
}
resetPerPage = (perPage) => {
this.setState({
perPage: perPage
}, () => {
this.getDeviceErrorsListByPage(1);
});
}
render() {
return (
<Fragment>
@@ -149,6 +188,10 @@ class DeviceErrors extends Component {
loading={this.state.loading}
errorMsg={this.state.errorMsg}
items={this.state.devicesErrors}
getDeviceErrorsListByPage={this.getDeviceErrorsListByPage}
curPerPage={this.state.perPage}
resetPerPage={this.resetPerPage}
pageInfo={this.state.pageInfo}
/>
</div>
</div>

View File

@@ -21,6 +21,7 @@ from seahub.utils import is_pro_version
logger = logging.getLogger(__name__)
class AdminDeviceErrors(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication)
throttle_classes = (UserRateThrottle, )
@@ -34,14 +35,30 @@ class AdminDeviceErrors(APIView):
if not request.user.admin_permissions.other_permission():
return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.')
try:
current_page = int(request.GET.get('page', '1'))
per_page = int(request.GET.get('per_page', '100'))
except ValueError:
current_page = 1
per_page = 100
start = (current_page - 1) * per_page
limit = per_page + 1
return_results = []
try:
device_errors = seafile_api.list_repo_sync_errors()
device_errors = seafile_api.list_repo_sync_errors(start, limit)
except SearpcError as e:
logger.error(e)
error_msg = 'Internal Server Error'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
if len(device_errors) > per_page:
device_errors = device_errors[:per_page]
has_next_page = True
else:
has_next_page = False
for error in device_errors:
result = {}
result['email'] = error.email if error.email else ''
@@ -51,7 +68,7 @@ class AdminDeviceErrors(APIView):
result['repo_id'] = error.repo_id if error.repo_id else ''
result['error_msg'] = error.error_con if error.error_con else ''
tokens = TokenV2.objects.filter(device_id = error.peer_id)
tokens = TokenV2.objects.filter(device_id=error.peer_id)
if tokens:
result['device_name'] = tokens[0].device_name
result['client_version'] = tokens[0].client_version
@@ -66,7 +83,12 @@ class AdminDeviceErrors(APIView):
return_results.append(result)
return Response(return_results)
page_info = {
'has_next_page': has_next_page,
'current_page': current_page
}
return Response({"page_info": page_info, "device_errors": return_results})
def delete(self, request, format=None):
if not is_pro_version():