mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-16 07:08:55 +00:00
add_close_face_recognition (#6998)
* add_close_face_recognition * update * update * update --------- Co-authored-by: zheng.shen <zheng.shen@seafile.com>
This commit is contained in:
@@ -111,7 +111,7 @@ const LibSettingsDialog = ({ repoID, currentRepoInfo, toggleDialog, tab }) => {
|
||||
<LibFaceRecognitionSettingPanel
|
||||
repoID={repoID}
|
||||
value={enableFaceRecognition}
|
||||
submit={(value) => { updateEnableFaceRecognition(true); }}
|
||||
submit={(value) => { updateEnableFaceRecognition(value); }}
|
||||
toggleDialog={toggleDialog}
|
||||
/>
|
||||
</TabPane>
|
||||
|
@@ -267,6 +267,11 @@ class MetadataManagerAPI {
|
||||
return this.req.post(url);
|
||||
};
|
||||
|
||||
closeFaceRecognition = (repoID) => {
|
||||
const url = this.server + '/api/v2.1/repos/' + repoID + '/metadata/face-recognition/';
|
||||
return this.req.delete(url);
|
||||
};
|
||||
|
||||
getFaceData = (repoID, start = 0, limit = 1000) => {
|
||||
const url = this.server + '/api/v2.1/repos/' + repoID + '/metadata/face-records/?start=' + start + '&limit=' + limit;
|
||||
return this.req.get(url);
|
||||
|
@@ -7,18 +7,24 @@ import { gettext } from '../../../../utils/constants';
|
||||
import metadataAPI from '../../../api';
|
||||
import toaster from '../../../../components/toast';
|
||||
import { Utils } from '../../../../utils/utils';
|
||||
import TurnOffConfirmDialog from './turn-off-confirm';
|
||||
|
||||
import './index.css';
|
||||
|
||||
const MetadataFaceRecognitionDialog = ({ value: oldValue, repoID, toggleDialog: toggle, submit }) => {
|
||||
const [value, setValue] = useState(oldValue);
|
||||
const [submitting, setSubmitting] = useState(false);
|
||||
const [showTurnOffConfirmDialog, setShowTurnOffConfirmDialog] = useState(false);
|
||||
|
||||
const onToggle = useCallback(() => {
|
||||
toggle();
|
||||
}, [toggle]);
|
||||
|
||||
const onSubmit = useCallback(() => {
|
||||
if (!value) {
|
||||
setShowTurnOffConfirmDialog(true);
|
||||
return;
|
||||
}
|
||||
setSubmitting(true);
|
||||
metadataAPI.openFaceRecognition(repoID).then(res => {
|
||||
submit(true);
|
||||
@@ -28,6 +34,23 @@ const MetadataFaceRecognitionDialog = ({ value: oldValue, repoID, toggleDialog:
|
||||
toaster.danger(errorMsg);
|
||||
setSubmitting(false);
|
||||
});
|
||||
}, [repoID, submit, toggle, value]);
|
||||
|
||||
const turnOffConfirmToggle = useCallback(() => {
|
||||
setShowTurnOffConfirmDialog(!showTurnOffConfirmDialog);
|
||||
}, [showTurnOffConfirmDialog]);
|
||||
|
||||
const turnOffConfirmSubmit = useCallback(() => {
|
||||
setShowTurnOffConfirmDialog(false);
|
||||
setSubmitting(true);
|
||||
metadataAPI.closeFaceRecognition(repoID).then(res => {
|
||||
submit(false);
|
||||
toggle();
|
||||
}).catch(error => {
|
||||
const errorMsg = Utils.getErrorMsg(error);
|
||||
toaster.danger(errorMsg);
|
||||
setSubmitting(false);
|
||||
});
|
||||
}, [repoID, submit, toggle]);
|
||||
|
||||
const onValueChange = useCallback(() => {
|
||||
@@ -37,25 +60,30 @@ const MetadataFaceRecognitionDialog = ({ value: oldValue, repoID, toggleDialog:
|
||||
|
||||
return (
|
||||
<>
|
||||
<ModalBody className="metadata-face-recognition-dialog">
|
||||
<Switch
|
||||
checked={value}
|
||||
disabled={submitting || oldValue}
|
||||
size="large"
|
||||
textPosition="right"
|
||||
className={classnames('change-face-recognition-status-management w-100', { 'disabled': submitting || oldValue })}
|
||||
onChange={onValueChange}
|
||||
placeholder={gettext('Face recognition')}
|
||||
/>
|
||||
<p className="tip m-0">
|
||||
{gettext('Enable face recognition to identify people in your photos.')}
|
||||
</p>
|
||||
</ModalBody>
|
||||
{!oldValue && (
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={onToggle}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" disabled={oldValue === value || submitting} onClick={onSubmit}>{gettext('Submit')}</Button>
|
||||
</ModalFooter>
|
||||
{!showTurnOffConfirmDialog && (
|
||||
<>
|
||||
<ModalBody className="metadata-face-recognition-dialog">
|
||||
<Switch
|
||||
checked={value}
|
||||
disabled={submitting}
|
||||
size="large"
|
||||
textPosition="right"
|
||||
className={classnames('change-face-recognition-status-management w-100', { 'disabled': submitting || oldValue })}
|
||||
onChange={onValueChange}
|
||||
placeholder={gettext('Face recognition')}
|
||||
/>
|
||||
<p className="tip m-0">
|
||||
{gettext('Enable face recognition to identify people in your photos.')}
|
||||
</p>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={onToggle}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" disabled={oldValue === value || submitting} onClick={onSubmit}>{gettext('Submit')}</Button>
|
||||
</ModalFooter>
|
||||
</>
|
||||
)}
|
||||
{showTurnOffConfirmDialog && (
|
||||
<TurnOffConfirmDialog toggle={turnOffConfirmToggle} submit={turnOffConfirmSubmit} />
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
@@ -0,0 +1,26 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';
|
||||
import { gettext } from '../../../../utils/constants';
|
||||
|
||||
const TurnOffConfirmDialog = ({ toggle, submit }) => {
|
||||
return (
|
||||
<Modal isOpen={true} toggle={toggle}>
|
||||
<ModalHeader toggle={toggle}>{gettext('Turn off face recognition')}</ModalHeader>
|
||||
<ModalBody>
|
||||
<p>{gettext('Do you really want to turn off face recognition? Existing results will all be deleted.')}</p>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={toggle}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" onClick={submit}>{gettext('Turn off')}</Button>
|
||||
</ModalFooter>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
|
||||
TurnOffConfirmDialog.propTypes = {
|
||||
toggle: PropTypes.func.isRequired,
|
||||
submit: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default TurnOffConfirmDialog;
|
@@ -14,7 +14,7 @@ from seahub.repo_metadata.models import RepoMetadata, RepoMetadataViews
|
||||
from seahub.views import check_folder_permission
|
||||
from seahub.repo_metadata.utils import add_init_metadata_task, gen_unique_id, init_metadata, \
|
||||
get_unmodifiable_columns, can_read_metadata, init_faces, add_init_face_recognition_task, \
|
||||
extract_file_details, get_someone_similar_faces
|
||||
extract_file_details, get_someone_similar_faces, remove_faces_table
|
||||
from seahub.repo_metadata.metadata_server_api import MetadataServerAPI, list_metadata_view_records
|
||||
from seahub.utils.timeutils import datetime_to_isoformat_timestr
|
||||
from seahub.utils.repo import is_repo_admin
|
||||
@@ -1167,6 +1167,42 @@ class FaceRecognitionManage(APIView):
|
||||
|
||||
return Response({'task_id': task_id})
|
||||
|
||||
def delete(self, request, repo_id):
|
||||
# recource check
|
||||
repo = seafile_api.get_repo(repo_id)
|
||||
if not repo:
|
||||
error_msg = 'Library %s not found.' % repo_id
|
||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||
|
||||
# permission check
|
||||
if not is_repo_admin(request.user.username, repo_id):
|
||||
error_msg = 'Permission denied.'
|
||||
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||
|
||||
# check dose the repo have opened metadata manage
|
||||
record = RepoMetadata.objects.filter(repo_id=repo_id).first()
|
||||
if not record or not record.enabled or not record.face_recognition_enabled:
|
||||
error_msg = f'The repo {repo_id} has disabled the face recognition manage.'
|
||||
return api_error(status.HTTP_409_CONFLICT, error_msg)
|
||||
|
||||
metadata_server_api = MetadataServerAPI(repo_id, request.user.username)
|
||||
try:
|
||||
remove_faces_table(metadata_server_api)
|
||||
except Exception as err:
|
||||
logger.error(err)
|
||||
error_msg = 'Internal Server Error'
|
||||
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||
|
||||
try:
|
||||
record.face_recognition_enabled = False
|
||||
record.save()
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
error_msg = 'Internal Server Error'
|
||||
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||
|
||||
return Response({'success': True})
|
||||
|
||||
|
||||
class MetadataExtractFileDetails(APIView):
|
||||
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
||||
|
Reference in New Issue
Block a user