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:
@@ -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>
|
||||||
|
@@ -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():
|
||||||
|
Reference in New Issue
Block a user