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

View File

@@ -21,6 +21,7 @@ from seahub.utils import is_pro_version
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class AdminDeviceErrors(APIView): class AdminDeviceErrors(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication) authentication_classes = (TokenAuthentication, SessionAuthentication)
throttle_classes = (UserRateThrottle, ) throttle_classes = (UserRateThrottle, )
@@ -34,14 +35,30 @@ class AdminDeviceErrors(APIView):
if not request.user.admin_permissions.other_permission(): if not request.user.admin_permissions.other_permission():
return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.') 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 = [] return_results = []
try: try:
device_errors = seafile_api.list_repo_sync_errors() device_errors = seafile_api.list_repo_sync_errors(start, limit)
except SearpcError as e: except SearpcError as e:
logger.error(e) logger.error(e)
error_msg = 'Internal Server Error' error_msg = 'Internal Server Error'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) 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: for error in device_errors:
result = {} result = {}
result['email'] = error.email if error.email else '' 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['repo_id'] = error.repo_id if error.repo_id else ''
result['error_msg'] = error.error_con if error.error_con 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: if tokens:
result['device_name'] = tokens[0].device_name result['device_name'] = tokens[0].device_name
result['client_version'] = tokens[0].client_version result['client_version'] = tokens[0].client_version
@@ -66,7 +83,12 @@ class AdminDeviceErrors(APIView):
return_results.append(result) 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): def delete(self, request, format=None):
if not is_pro_version(): if not is_pro_version():