mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-27 07:44:50 +00:00
remove ocr settings (#7975)
* remove ocr settings * update --------- Co-authored-by: 孙永强 <11704063+s-yongqiang@user.noreply.gitee.com>
This commit is contained in:
@@ -16,7 +16,7 @@ const SIDE_PANEL_EXPANDED_WIDTH = 300;
|
|||||||
const ImageDialog = ({ repoID, repoInfo, enableRotate: oldEnableRotate = true, imageItems, imageIndex, closeImagePopup, moveToPrevImage, moveToNextImage, onDeleteImage, onRotateImage, isCustomPermission }) => {
|
const ImageDialog = ({ repoID, repoInfo, enableRotate: oldEnableRotate = true, imageItems, imageIndex, closeImagePopup, moveToPrevImage, moveToNextImage, onDeleteImage, onRotateImage, isCustomPermission }) => {
|
||||||
const [expanded, setExpanded] = useState(false);
|
const [expanded, setExpanded] = useState(false);
|
||||||
|
|
||||||
const { enableOCR, enableMetadata, canModify, onOCRByImageDialog } = useMetadataAIOperations();
|
const { enableMetadata, canModify, onOCRByImageDialog } = useMetadataAIOperations();
|
||||||
|
|
||||||
const downloadImage = useCallback((url) => {
|
const downloadImage = useCallback((url) => {
|
||||||
location.href = url;
|
location.href = url;
|
||||||
@@ -51,7 +51,7 @@ const ImageDialog = ({ repoID, repoInfo, enableRotate: oldEnableRotate = true, i
|
|||||||
|
|
||||||
const isSystemFolder = SYSTEM_FOLDERS.find(folderPath => mainImg.parentDir.startsWith(folderPath));
|
const isSystemFolder = SYSTEM_FOLDERS.find(folderPath => mainImg.parentDir.startsWith(folderPath));
|
||||||
let onOCR = null;
|
let onOCR = null;
|
||||||
if (enableOCR && enableMetadata && canModify && !isSystemFolder) {
|
if (enableMetadata && canModify && !isSystemFolder) {
|
||||||
onOCR = () => onOCRByImageDialog({ parentDir: mainImg.parentDir, fileName: mainImg.name }, document.activeElement);
|
onOCR = () => onOCRByImageDialog({ parentDir: mainImg.parentDir, fileName: mainImg.name }, document.activeElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -9,7 +9,6 @@ import {
|
|||||||
MetadataStatusManagementDialog as LibExtendedPropertiesSettingPanel,
|
MetadataStatusManagementDialog as LibExtendedPropertiesSettingPanel,
|
||||||
MetadataFaceRecognitionDialog as LibFaceRecognitionSettingPanel,
|
MetadataFaceRecognitionDialog as LibFaceRecognitionSettingPanel,
|
||||||
MetadataTagsStatusDialog as LibMetadataTagsStatusSettingPanel,
|
MetadataTagsStatusDialog as LibMetadataTagsStatusSettingPanel,
|
||||||
MetadataOCRStatusManagementDialog as LibMetadataOCRStatusSettingPanel,
|
|
||||||
useMetadata
|
useMetadata
|
||||||
} from '../../metadata';
|
} from '../../metadata';
|
||||||
import SeahubModalHeader from '@/components/common/seahub-modal-header';
|
import SeahubModalHeader from '@/components/common/seahub-modal-header';
|
||||||
@@ -40,7 +39,7 @@ const LibSettingsDialog = ({ repoID, currentRepoInfo, toggleDialog, tab, showMig
|
|||||||
const { encrypted, is_admin } = currentRepoInfo;
|
const { encrypted, is_admin } = currentRepoInfo;
|
||||||
const { enableMetadataManagement } = window.app.pageOptions;
|
const { enableMetadataManagement } = window.app.pageOptions;
|
||||||
const { updateEnableFaceRecognition } = useMetadata();
|
const { updateEnableFaceRecognition } = useMetadata();
|
||||||
const { enableMetadata, updateEnableMetadata, enableTags, tagsLang, updateEnableTags, enableOCR, updateEnableOCR, enableFaceRecognition, globalHiddenColumns, modifyGlobalHiddenColumns } = useMetadataStatus();
|
const { enableMetadata, updateEnableMetadata, enableTags, tagsLang, updateEnableTags, enableFaceRecognition, globalHiddenColumns, modifyGlobalHiddenColumns } = useMetadataStatus();
|
||||||
const enableHistorySetting = is_admin; // repo owner, admin of the department which the repo belongs to, and ...
|
const enableHistorySetting = is_admin; // repo owner, admin of the department which the repo belongs to, and ...
|
||||||
const enableAutoDelSetting = is_admin && enableRepoAutoDel;
|
const enableAutoDelSetting = is_admin && enableRepoAutoDel;
|
||||||
const enableExtendedPropertiesSetting = !encrypted && is_admin && enableMetadataManagement;
|
const enableExtendedPropertiesSetting = !encrypted && is_admin && enableMetadataManagement;
|
||||||
@@ -162,22 +161,6 @@ const LibSettingsDialog = ({ repoID, currentRepoInfo, toggleDialog, tab, showMig
|
|||||||
{gettext('Tags')}
|
{gettext('Tags')}
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</NavItem>
|
</NavItem>
|
||||||
{enableSeafileAI &&
|
|
||||||
<NavItem
|
|
||||||
role="tab"
|
|
||||||
aria-selected={activeTab === TAB.OCR_SETTING}
|
|
||||||
aria-controls="ocr-setting-panel"
|
|
||||||
>
|
|
||||||
<NavLink
|
|
||||||
className={activeTab === TAB.OCR_SETTING ? 'active' : ''}
|
|
||||||
onClick={toggleTab.bind(this, TAB.OCR_SETTING)}
|
|
||||||
tabIndex="0"
|
|
||||||
onKeyDown={onTabKeyDown}
|
|
||||||
>
|
|
||||||
{gettext('OCR')}
|
|
||||||
</NavLink>
|
|
||||||
</NavItem>
|
|
||||||
}
|
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
</Nav>
|
</Nav>
|
||||||
@@ -238,18 +221,6 @@ const LibSettingsDialog = ({ repoID, currentRepoInfo, toggleDialog, tab, showMig
|
|||||||
/>
|
/>
|
||||||
</TabPane>
|
</TabPane>
|
||||||
)}
|
)}
|
||||||
{(enableExtendedPropertiesSetting && activeTab === TAB.OCR_SETTING) && (
|
|
||||||
<TabPane tabId={TAB.OCR_SETTING} role="tabpanel" id="ocr-setting-panel">
|
|
||||||
<LibMetadataOCRStatusSettingPanel
|
|
||||||
repoID={repoID}
|
|
||||||
value={enableOCR}
|
|
||||||
lang={tagsLang}
|
|
||||||
submit={updateEnableOCR}
|
|
||||||
toggleDialog={toggleDialog}
|
|
||||||
enableMetadata={enableMetadata}
|
|
||||||
/>
|
|
||||||
</TabPane>
|
|
||||||
)}
|
|
||||||
</TabContent>
|
</TabContent>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
</ModalBody>
|
</ModalBody>
|
||||||
|
@@ -10,14 +10,12 @@ import { checkIsDir } from '../../metadata/utils/row';
|
|||||||
import { Utils } from '../../utils/utils';
|
import { Utils } from '../../utils/utils';
|
||||||
import { getFileNameFromRecord } from '../../metadata/utils/cell';
|
import { getFileNameFromRecord } from '../../metadata/utils/cell';
|
||||||
import { getColumnByKey } from '../../metadata/utils/column';
|
import { getColumnByKey } from '../../metadata/utils/column';
|
||||||
import { useMetadataStatus } from '../../hooks';
|
|
||||||
import { openInNewTab, openParentFolder } from '../../metadata/utils/file';
|
import { openInNewTab, openParentFolder } from '../../metadata/utils/file';
|
||||||
|
|
||||||
const TableFilesToolbar = ({ repoID }) => {
|
const TableFilesToolbar = ({ repoID }) => {
|
||||||
const [selectedRecordIds, setSelectedRecordIds] = useState([]);
|
const [selectedRecordIds, setSelectedRecordIds] = useState([]);
|
||||||
const metadataRef = useRef([]);
|
const metadataRef = useRef([]);
|
||||||
const menuRef = useRef(null);
|
const menuRef = useRef(null);
|
||||||
const { enableOCR } = useMetadataStatus();
|
|
||||||
|
|
||||||
const canModify = window.sfMetadataContext && window.sfMetadataContext.canModify();
|
const canModify = window.sfMetadataContext && window.sfMetadataContext.canModify();
|
||||||
const eventBus = window.sfMetadataContext && window.sfMetadataContext.eventBus;
|
const eventBus = window.sfMetadataContext && window.sfMetadataContext.eventBus;
|
||||||
@@ -95,7 +93,7 @@ const TableFilesToolbar = ({ repoID }) => {
|
|||||||
aiOptions.push(GENERATE_DESCRIPTION);
|
aiOptions.push(GENERATE_DESCRIPTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enableOCR && (isImage || isPDF)) {
|
if (isImage || isPDF) {
|
||||||
aiOptions.push(OCR);
|
aiOptions.push(OCR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,7 +103,7 @@ const TableFilesToolbar = ({ repoID }) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}, [selectedRecordIds, records, enableOCR]);
|
}, [selectedRecordIds, records]);
|
||||||
|
|
||||||
const onMenuItemClick = useCallback((operation) => {
|
const onMenuItemClick = useCallback((operation) => {
|
||||||
const records = selectedRecordIds.map(id => RowUtils.getRecordById(id, metadataRef.current)).filter(Boolean);
|
const records = selectedRecordIds.map(id => RowUtils.getRecordById(id, metadataRef.current)).filter(Boolean);
|
||||||
|
@@ -3,8 +3,7 @@ const TAB = {
|
|||||||
AUTO_DEL_SETTING: 'auto_delete_setting',
|
AUTO_DEL_SETTING: 'auto_delete_setting',
|
||||||
EXTENDED_PROPERTIES_SETTING: 'extended_properties_setting',
|
EXTENDED_PROPERTIES_SETTING: 'extended_properties_setting',
|
||||||
FACE_RECOGNITION_SETTING: 'face_recognition_setting',
|
FACE_RECOGNITION_SETTING: 'face_recognition_setting',
|
||||||
TAGS_SETTING: 'tags_setting',
|
TAGS_SETTING: 'tags_setting'
|
||||||
OCR_SETTING: 'ocr_setting',
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export { TAB };
|
export { TAB };
|
||||||
|
@@ -22,7 +22,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
|
|||||||
const [enableMetadata, setEnableMetadata] = useState(false);
|
const [enableMetadata, setEnableMetadata] = useState(false);
|
||||||
const [enableTags, setEnableTags] = useState(false);
|
const [enableTags, setEnableTags] = useState(false);
|
||||||
const [tagsLang, setTagsLang] = useState('en');
|
const [tagsLang, setTagsLang] = useState('en');
|
||||||
const [enableOCR, setEnableOCR] = useState(false);
|
|
||||||
const [detailsSettings, setDetailsSettings] = useState({});
|
const [detailsSettings, setDetailsSettings] = useState({});
|
||||||
const [isBeingBuilt, setIsBeingBuilt] = useState(false);
|
const [isBeingBuilt, setIsBeingBuilt] = useState(false);
|
||||||
const [enableFaceRecognition, setEnableFaceRecognition] = useState(false);
|
const [enableFaceRecognition, setEnableFaceRecognition] = useState(false);
|
||||||
@@ -44,7 +43,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
|
|||||||
setLoading(true);
|
setLoading(true);
|
||||||
setEnableMetadata(false);
|
setEnableMetadata(false);
|
||||||
setEnableTags(false);
|
setEnableTags(false);
|
||||||
setEnableOCR(false);
|
|
||||||
setEnableFaceRecognition(false);
|
setEnableFaceRecognition(false);
|
||||||
setDetailsSettings({});
|
setDetailsSettings({});
|
||||||
setIsBeingBuilt(false);
|
setIsBeingBuilt(false);
|
||||||
@@ -59,7 +57,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
|
|||||||
tags_enabled: enableTags,
|
tags_enabled: enableTags,
|
||||||
tags_lang: tagsLang,
|
tags_lang: tagsLang,
|
||||||
details_settings: detailsSettings,
|
details_settings: detailsSettings,
|
||||||
ocr_enabled: enableOCR,
|
|
||||||
face_recognition_enabled: enableFaceRecognition,
|
face_recognition_enabled: enableFaceRecognition,
|
||||||
global_hidden_columns: globalHiddenColumns,
|
global_hidden_columns: globalHiddenColumns,
|
||||||
} = res.data;
|
} = res.data;
|
||||||
@@ -69,7 +66,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
|
|||||||
setEnableTags(enableTags);
|
setEnableTags(enableTags);
|
||||||
setTagsLang(tagsLang || 'en');
|
setTagsLang(tagsLang || 'en');
|
||||||
setDetailsSettings(JSON.parse(detailsSettings));
|
setDetailsSettings(JSON.parse(detailsSettings));
|
||||||
setEnableOCR(enableSeafileAI && enableOCR);
|
|
||||||
setEnableFaceRecognition(enableSeafileAI && enableFaceRecognition);
|
setEnableFaceRecognition(enableSeafileAI && enableFaceRecognition);
|
||||||
setEnableMetadata(enableMetadata);
|
setEnableMetadata(enableMetadata);
|
||||||
const parsedGlobalHiddenColumns = typeof globalHiddenColumns === 'string'
|
const parsedGlobalHiddenColumns = typeof globalHiddenColumns === 'string'
|
||||||
@@ -96,7 +92,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
|
|||||||
if (!newValue) {
|
if (!newValue) {
|
||||||
cancelMetadataURL(true);
|
cancelMetadataURL(true);
|
||||||
setEnableTags(false);
|
setEnableTags(false);
|
||||||
setEnableOCR(false);
|
|
||||||
setEnableFaceRecognition(false);
|
setEnableFaceRecognition(false);
|
||||||
}
|
}
|
||||||
setDetailsSettings({});
|
setDetailsSettings({});
|
||||||
@@ -115,10 +110,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
|
|||||||
setTagsLang(lang);
|
setTagsLang(lang);
|
||||||
}, [enableTags, tagsLang, cancelMetadataURL]);
|
}, [enableTags, tagsLang, cancelMetadataURL]);
|
||||||
|
|
||||||
const updateEnableOCR = useCallback((newValue) => {
|
|
||||||
if (newValue === enableOCR) return;
|
|
||||||
setEnableOCR(newValue);
|
|
||||||
}, [enableOCR]);
|
|
||||||
|
|
||||||
const updateEnableFaceRecognition = useCallback((newValue) => {
|
const updateEnableFaceRecognition = useCallback((newValue) => {
|
||||||
if (newValue === enableFaceRecognition) return;
|
if (newValue === enableFaceRecognition) return;
|
||||||
@@ -169,8 +160,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
|
|||||||
updateEnableTags,
|
updateEnableTags,
|
||||||
detailsSettings,
|
detailsSettings,
|
||||||
modifyDetailsSettings,
|
modifyDetailsSettings,
|
||||||
enableOCR,
|
|
||||||
updateEnableOCR,
|
|
||||||
enableFaceRecognition,
|
enableFaceRecognition,
|
||||||
updateEnableFaceRecognition,
|
updateEnableFaceRecognition,
|
||||||
globalHiddenColumns,
|
globalHiddenColumns,
|
||||||
|
@@ -393,16 +393,6 @@ class MetadataManagerAPI {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// ocr
|
// ocr
|
||||||
openOCR = (repoID) => {
|
|
||||||
const url = this.server + '/api/v2.1/repos/' + repoID + '/metadata/ocr/';
|
|
||||||
return this.req.put(url);
|
|
||||||
};
|
|
||||||
|
|
||||||
closeOCR = (repoID) => {
|
|
||||||
const url = this.server + '/api/v2.1/repos/' + repoID + '/metadata/ocr/';
|
|
||||||
return this.req.delete(url);
|
|
||||||
};
|
|
||||||
|
|
||||||
ocr = (repoID, filePath) => {
|
ocr = (repoID, filePath) => {
|
||||||
const url = this.server + '/api/v2.1/ai/ocr/';
|
const url = this.server + '/api/v2.1/ai/ocr/';
|
||||||
const params = {
|
const params = {
|
||||||
|
@@ -1,102 +0,0 @@
|
|||||||
import React, { useCallback, useState } from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import classnames from 'classnames';
|
|
||||||
import { ModalBody, ModalFooter, Button } from 'reactstrap';
|
|
||||||
import Switch from '../../../../components/switch';
|
|
||||||
import toaster from '../../../../components/toast';
|
|
||||||
import TurnOffConfirmDialog from '../turn-off-confirm-dialog';
|
|
||||||
import metadataAPI from '../../../api';
|
|
||||||
import { Utils } from '../../../../utils/utils';
|
|
||||||
import { gettext } from '../../../../utils/constants';
|
|
||||||
|
|
||||||
const MetadataOCRStatusManagementDialog = ({ value: oldValue, repoID, toggleDialog: toggle, submit, enableMetadata }) => {
|
|
||||||
const [value, setValue] = useState(oldValue);
|
|
||||||
const [submitting, setSubmitting] = useState(false);
|
|
||||||
const [showTurnOffConfirmDialog, setShowTurnOffConfirmDialog] = useState(false);
|
|
||||||
|
|
||||||
const onToggle = useCallback(() => {
|
|
||||||
if (submitting) return;
|
|
||||||
toggle && toggle();
|
|
||||||
}, [submitting, toggle]);
|
|
||||||
|
|
||||||
const onSubmit = useCallback(() => {
|
|
||||||
if (!value) {
|
|
||||||
setShowTurnOffConfirmDialog(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setSubmitting(true);
|
|
||||||
metadataAPI.openOCR(repoID).then(res => {
|
|
||||||
submit(true);
|
|
||||||
toggle();
|
|
||||||
}).catch(error => {
|
|
||||||
const errorMsg = Utils.getErrorMsg(error);
|
|
||||||
toaster.danger(errorMsg);
|
|
||||||
setSubmitting(false);
|
|
||||||
});
|
|
||||||
}, [repoID, value, submit, toggle]);
|
|
||||||
|
|
||||||
const turnOffConfirmToggle = useCallback(() => {
|
|
||||||
setShowTurnOffConfirmDialog(!showTurnOffConfirmDialog);
|
|
||||||
}, [showTurnOffConfirmDialog]);
|
|
||||||
|
|
||||||
const turnOffConfirmSubmit = useCallback(() => {
|
|
||||||
setShowTurnOffConfirmDialog(false);
|
|
||||||
setSubmitting(true);
|
|
||||||
metadataAPI.closeOCR(repoID).then(res => {
|
|
||||||
submit(false);
|
|
||||||
toggle();
|
|
||||||
}).catch(error => {
|
|
||||||
const errorMsg = Utils.getErrorMsg(error);
|
|
||||||
toaster.danger(errorMsg);
|
|
||||||
setSubmitting(false);
|
|
||||||
});
|
|
||||||
}, [repoID, submit, toggle]);
|
|
||||||
|
|
||||||
const onValueChange = useCallback(() => {
|
|
||||||
const nextValue = !value;
|
|
||||||
setValue(nextValue);
|
|
||||||
}, [value]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{!showTurnOffConfirmDialog && (
|
|
||||||
<>
|
|
||||||
<ModalBody className="metadata-status-management-dialog">
|
|
||||||
{!enableMetadata && <p className="oepn-metadata-tip">{gettext('Please turn on extended properties setting first')}</p>}
|
|
||||||
<Switch
|
|
||||||
checked={value}
|
|
||||||
disabled={submitting || !enableMetadata}
|
|
||||||
size="large"
|
|
||||||
textPosition="right"
|
|
||||||
className={classnames('change-metadata-status-management w-100', { 'disabled': submitting })}
|
|
||||||
onChange={onValueChange}
|
|
||||||
placeholder={gettext('Enable OCR')}
|
|
||||||
/>
|
|
||||||
<p className="tip m-0">
|
|
||||||
{gettext('After enable OCR, you can extract text from images or scanned PDFs.')}
|
|
||||||
</p>
|
|
||||||
</ModalBody>
|
|
||||||
<ModalFooter>
|
|
||||||
<Button color="secondary" onClick={onToggle}>{gettext('Cancel')}</Button>
|
|
||||||
<Button color="primary" disabled={oldValue === value || submitting || !enableMetadata} onClick={onSubmit}>{gettext('Submit')}</Button>
|
|
||||||
</ModalFooter>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
{showTurnOffConfirmDialog && (
|
|
||||||
<TurnOffConfirmDialog title={gettext('Turn off OCR')} toggle={turnOffConfirmToggle} submit={turnOffConfirmSubmit}>
|
|
||||||
<p>{gettext('Do you really want to turn off OCR? Existing OCR results will be deleted.')}</p>
|
|
||||||
</TurnOffConfirmDialog>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
MetadataOCRStatusManagementDialog.propTypes = {
|
|
||||||
value: PropTypes.bool,
|
|
||||||
repoID: PropTypes.string.isRequired,
|
|
||||||
toggleDialog: PropTypes.func.isRequired,
|
|
||||||
submit: PropTypes.func.isRequired,
|
|
||||||
enableMetadata: PropTypes.bool.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default MetadataOCRStatusManagementDialog;
|
|
@@ -22,7 +22,7 @@ const AIIcon = () => {
|
|||||||
|
|
||||||
const [isMenuShow, setMenuShow] = useState(false);
|
const [isMenuShow, setMenuShow] = useState(false);
|
||||||
|
|
||||||
const { enableMetadata, enableTags, enableOCR } = useMetadataStatus();
|
const { enableMetadata, enableTags } = useMetadataStatus();
|
||||||
const { canModifyRecord, columns, record, onChange, onLocalRecordChange, updateFileTags, updateDescription } = useMetadataDetails();
|
const { canModifyRecord, columns, record, onChange, onLocalRecordChange, updateFileTags, updateDescription } = useMetadataDetails();
|
||||||
const { generateDescription, extractFileDetails, onOCR, generateFileTags } = useMetadataAIOperations();
|
const { generateDescription, extractFileDetails, onOCR, generateFileTags } = useMetadataAIOperations();
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ const AIIcon = () => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enableOCR && (isImage || isPdf)) {
|
if (isImage || isPdf) {
|
||||||
list.push({ value: OPERATION.OCR, label: gettext('Extract text'), record });
|
list.push({ value: OPERATION.OCR, label: gettext('Extract text'), record });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ const AIIcon = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}, [enableOCR, enableTags, canModifyRecord, columns, record]);
|
}, [enableTags, canModifyRecord, columns, record]);
|
||||||
|
|
||||||
const onToggle = useCallback((event) => {
|
const onToggle = useCallback((event) => {
|
||||||
event && event.preventDefault();
|
event && event.preventDefault();
|
||||||
|
@@ -13,7 +13,6 @@ const MetadataAIOperationsContext = React.createContext(null);
|
|||||||
export const MetadataAIOperationsProvider = ({
|
export const MetadataAIOperationsProvider = ({
|
||||||
repoID,
|
repoID,
|
||||||
enableMetadata = false,
|
enableMetadata = false,
|
||||||
enableOCR = false,
|
|
||||||
enableTags = false,
|
enableTags = false,
|
||||||
tagsLang,
|
tagsLang,
|
||||||
repoInfo,
|
repoInfo,
|
||||||
@@ -140,7 +139,6 @@ export const MetadataAIOperationsProvider = ({
|
|||||||
return (
|
return (
|
||||||
<MetadataAIOperationsContext.Provider value={{
|
<MetadataAIOperationsContext.Provider value={{
|
||||||
enableMetadata,
|
enableMetadata,
|
||||||
enableOCR,
|
|
||||||
enableTags,
|
enableTags,
|
||||||
tagsLang,
|
tagsLang,
|
||||||
canModify,
|
canModify,
|
||||||
|
@@ -7,7 +7,7 @@ import { useMetadataStatus } from '../../hooks';
|
|||||||
const MetadataMiddlewareContext = React.createContext(null);
|
const MetadataMiddlewareContext = React.createContext(null);
|
||||||
|
|
||||||
export const MetadataMiddlewareProvider = ({ repoID, currentPath, repoInfo, selectTagsView, tagsChangedCallback, children }) => {
|
export const MetadataMiddlewareProvider = ({ repoID, currentPath, repoInfo, selectTagsView, tagsChangedCallback, children }) => {
|
||||||
const { enableMetadata, enableOCR, enableTags, tagsLang } = useMetadataStatus();
|
const { enableMetadata, enableTags, tagsLang } = useMetadataStatus();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MetadataMiddlewareContext.Provider value={{}}>
|
<MetadataMiddlewareContext.Provider value={{}}>
|
||||||
@@ -16,7 +16,6 @@ export const MetadataMiddlewareProvider = ({ repoID, currentPath, repoInfo, sele
|
|||||||
<MetadataAIOperationsProvider
|
<MetadataAIOperationsProvider
|
||||||
repoID={repoID}
|
repoID={repoID}
|
||||||
enableMetadata={enableMetadata}
|
enableMetadata={enableMetadata}
|
||||||
enableOCR={enableOCR}
|
|
||||||
enableTags={enableTags}
|
enableTags={enableTags}
|
||||||
tagsLang={tagsLang}
|
tagsLang={tagsLang}
|
||||||
repoInfo={repoInfo}
|
repoInfo={repoInfo}
|
||||||
|
@@ -4,7 +4,6 @@ export { default as SeafileMetadata } from './views';
|
|||||||
export { default as MetadataStatusManagementDialog } from './components/dialog/metadata-status-manage-dialog';
|
export { default as MetadataStatusManagementDialog } from './components/dialog/metadata-status-manage-dialog';
|
||||||
export { default as MetadataFaceRecognitionDialog } from './components/dialog/metadata-face-recognition-dialog';
|
export { default as MetadataFaceRecognitionDialog } from './components/dialog/metadata-face-recognition-dialog';
|
||||||
export { default as MetadataTagsStatusDialog } from './components/dialog/metadata-tags-status-dialog';
|
export { default as MetadataTagsStatusDialog } from './components/dialog/metadata-tags-status-dialog';
|
||||||
export { default as MetadataOCRStatusManagementDialog } from './components/dialog/metadata-ocr-status-management-dialog';
|
|
||||||
export { default as MetadataDetails } from './components/metadata-details';
|
export { default as MetadataDetails } from './components/metadata-details';
|
||||||
export { default as MetadataTreeView } from './metadata-tree-view';
|
export { default as MetadataTreeView } from './metadata-tree-view';
|
||||||
export { default as metadataAPI } from './api';
|
export { default as metadataAPI } from './api';
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
import React, { useState, useRef, useCallback, useMemo } from 'react';
|
import React, { useState, useRef, useCallback, useMemo } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { useMetadataStatus } from '@/hooks';
|
|
||||||
import { gettext, enableSeafileAI } from '@/utils/constants';
|
import { gettext, enableSeafileAI } from '@/utils/constants';
|
||||||
import { Utils } from '@/utils/utils';
|
import { Utils } from '@/utils/utils';
|
||||||
import DeleteFolderDialog from '@/components/dialog/delete-folder-dialog';
|
import DeleteFolderDialog from '@/components/dialog/delete-folder-dialog';
|
||||||
@@ -41,7 +40,6 @@ const ContextMenu = ({
|
|||||||
const [deletedFolderPath, setDeletedFolderPath] = useState('');
|
const [deletedFolderPath, setDeletedFolderPath] = useState('');
|
||||||
|
|
||||||
const { metadata } = useMetadataView();
|
const { metadata } = useMetadataView();
|
||||||
const { enableOCR } = useMetadataStatus();
|
|
||||||
|
|
||||||
const repoID = window.sfMetadataStore.repoId;
|
const repoID = window.sfMetadataStore.repoId;
|
||||||
|
|
||||||
@@ -220,7 +218,7 @@ const ContextMenu = ({
|
|||||||
aiOptions.push({ value: OPERATION.FILE_TAGS, label: gettext('Generate file tags'), record: record });
|
aiOptions.push({ value: OPERATION.FILE_TAGS, label: gettext('Generate file tags'), record: record });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enableSeafileAI && enableOCR && (isImage || isPdf)) {
|
if (enableSeafileAI && (isImage || isPdf)) {
|
||||||
aiOptions.push({ value: OPERATION.OCR, label: gettext('Extract text'), record });
|
aiOptions.push({ value: OPERATION.OCR, label: gettext('Extract text'), record });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,7 +229,7 @@ const ContextMenu = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}, [isGroupView, selectedPosition, recordMetrics, selectedRange, metadata, recordGetterByIndex, checkIsDescribableFile, enableOCR, getAbleDeleteRecords]);
|
}, [isGroupView, selectedPosition, recordMetrics, selectedRange, metadata, recordGetterByIndex, checkIsDescribableFile, getAbleDeleteRecords]);
|
||||||
|
|
||||||
const handleOptionClick = useCallback((option, event) => {
|
const handleOptionClick = useCallback((option, event) => {
|
||||||
switch (option.value) {
|
switch (option.value) {
|
||||||
|
@@ -762,7 +762,7 @@ class SharedDirView extends React.Component {
|
|||||||
const isRepoInfoBarShown = isDesktop && path == '/' && usedRepoTags.length != 0;
|
const isRepoInfoBarShown = isDesktop && path == '/' && usedRepoTags.length != 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MetadataAIOperationsProvider repoID={repoID} enableMetadata={false} enableOCR={false} repoInfo={{ permission: 'r' }} >
|
<MetadataAIOperationsProvider repoID={repoID} enableMetadata={false} repoInfo={{ permission: 'r' }} >
|
||||||
<div id="shared-dir-view" className="h-100 d-flex flex-column">
|
<div id="shared-dir-view" className="h-100 d-flex flex-column">
|
||||||
<div className="top-header d-flex justify-content-between flex-shrink-0">
|
<div className="top-header d-flex justify-content-between flex-shrink-0">
|
||||||
<a href={siteRoot}>
|
<a href={siteRoot}>
|
||||||
|
@@ -55,7 +55,6 @@ class MetadataManage(APIView):
|
|||||||
is_tags_enabled = False
|
is_tags_enabled = False
|
||||||
tags_lang = ''
|
tags_lang = ''
|
||||||
details_settings = '{}'
|
details_settings = '{}'
|
||||||
is_ocr_enabled = False
|
|
||||||
face_recognition_enabled = False
|
face_recognition_enabled = False
|
||||||
global_hidden_columns = []
|
global_hidden_columns = []
|
||||||
|
|
||||||
@@ -70,8 +69,6 @@ class MetadataManage(APIView):
|
|||||||
if record.tags_enabled:
|
if record.tags_enabled:
|
||||||
is_tags_enabled = True
|
is_tags_enabled = True
|
||||||
tags_lang = record.tags_lang
|
tags_lang = record.tags_lang
|
||||||
if record.ocr_enabled:
|
|
||||||
is_ocr_enabled = True
|
|
||||||
if record.face_recognition_enabled:
|
if record.face_recognition_enabled:
|
||||||
face_recognition_enabled = True
|
face_recognition_enabled = True
|
||||||
if not global_hidden_columns:
|
if not global_hidden_columns:
|
||||||
@@ -84,7 +81,6 @@ class MetadataManage(APIView):
|
|||||||
return Response({
|
return Response({
|
||||||
'enabled': is_enabled,
|
'enabled': is_enabled,
|
||||||
'tags_enabled': is_tags_enabled,
|
'tags_enabled': is_tags_enabled,
|
||||||
'ocr_enabled': is_ocr_enabled,
|
|
||||||
'face_recognition_enabled': face_recognition_enabled,
|
'face_recognition_enabled': face_recognition_enabled,
|
||||||
'tags_lang': tags_lang,
|
'tags_lang': tags_lang,
|
||||||
'details_settings': details_settings,
|
'details_settings': details_settings,
|
||||||
@@ -173,7 +169,6 @@ class MetadataManage(APIView):
|
|||||||
record.face_recognition_enabled = False
|
record.face_recognition_enabled = False
|
||||||
record.tags_enabled = False
|
record.tags_enabled = False
|
||||||
record.details_settings = '{}'
|
record.details_settings = '{}'
|
||||||
record.ocr_enabled = False
|
|
||||||
record.save()
|
record.save()
|
||||||
RepoMetadataViews.objects.filter(repo_id=repo_id).delete()
|
RepoMetadataViews.objects.filter(repo_id=repo_id).delete()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -256,66 +251,6 @@ class MetadataGlobalHiddenColumnsView(APIView):
|
|||||||
return Response({'success': True})
|
return Response({'success': True})
|
||||||
|
|
||||||
|
|
||||||
class MetadataOCRManageView(APIView):
|
|
||||||
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
|
||||||
permission_classes = (IsAuthenticated, )
|
|
||||||
throttle_classes = (UserRateThrottle, )
|
|
||||||
|
|
||||||
def put(self, request, repo_id):
|
|
||||||
|
|
||||||
# resource check
|
|
||||||
repo = seafile_api.get_repo(repo_id)
|
|
||||||
if not repo:
|
|
||||||
error_msg = f'Library {repo_id} not found.'
|
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
|
||||||
|
|
||||||
if not is_repo_admin(request.user.username, repo_id):
|
|
||||||
error_msg = 'Permission denied.'
|
|
||||||
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
|
||||||
|
|
||||||
metadata = RepoMetadata.objects.filter(repo_id=repo_id).first()
|
|
||||||
if not metadata or not metadata.enabled:
|
|
||||||
error_msg = f'The metadata module is not enabled for repo {repo_id}.'
|
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
|
||||||
|
|
||||||
try:
|
|
||||||
metadata.ocr_enabled = True
|
|
||||||
metadata.save()
|
|
||||||
except Exception as e:
|
|
||||||
logger.exception(e)
|
|
||||||
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, 'Internal Server Error')
|
|
||||||
|
|
||||||
return Response({'success': True})
|
|
||||||
|
|
||||||
def delete(self, request, repo_id):
|
|
||||||
# resource check
|
|
||||||
repo = seafile_api.get_repo(repo_id)
|
|
||||||
if not repo:
|
|
||||||
error_msg = f'Library {repo_id} not found.'
|
|
||||||
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.ocr_enabled:
|
|
||||||
error_msg = f'The repo {repo_id} has disabled the OCR.'
|
|
||||||
return api_error(status.HTTP_409_CONFLICT, error_msg)
|
|
||||||
|
|
||||||
try:
|
|
||||||
record.ocr_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 MetadataRecords(APIView):
|
class MetadataRecords(APIView):
|
||||||
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
||||||
permission_classes = (IsAuthenticated, )
|
permission_classes = (IsAuthenticated, )
|
||||||
|
@@ -3,7 +3,7 @@ from .apis import MetadataRecognizeFaces, MetadataRecords, MetadataManage, Metad
|
|||||||
MetadataFolders, MetadataViews, MetadataViewsMoveView, MetadataViewsDetailView, MetadataViewsDuplicateView, FacesRecords, \
|
MetadataFolders, MetadataViews, MetadataViewsMoveView, MetadataViewsDetailView, MetadataViewsDuplicateView, FacesRecords, \
|
||||||
FaceRecognitionManage, FacesRecord, MetadataExtractFileDetails, PeoplePhotos, MetadataTagsStatusManage, MetadataTags, \
|
FaceRecognitionManage, FacesRecord, MetadataExtractFileDetails, PeoplePhotos, MetadataTagsStatusManage, MetadataTags, \
|
||||||
MetadataTagsLinks, MetadataFileTags, MetadataTagFiles, MetadataMergeTags, MetadataTagsFiles, MetadataDetailsSettingsView, \
|
MetadataTagsLinks, MetadataFileTags, MetadataTagFiles, MetadataMergeTags, MetadataTagsFiles, MetadataDetailsSettingsView, \
|
||||||
MetadataOCRManageView, PeopleCoverPhoto, MetadataMigrateTags, MetadataExportTags, MetadataImportTags, MetadataGlobalHiddenColumnsView
|
PeopleCoverPhoto, MetadataMigrateTags, MetadataExportTags, MetadataImportTags, MetadataGlobalHiddenColumnsView
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
re_path(r'^$', MetadataManage.as_view(), name='api-v2.1-metadata'),
|
re_path(r'^$', MetadataManage.as_view(), name='api-v2.1-metadata'),
|
||||||
@@ -35,9 +35,6 @@ urlpatterns = [
|
|||||||
# global hidden columns
|
# global hidden columns
|
||||||
re_path(r'^global-hidden-columns/$', MetadataGlobalHiddenColumnsView.as_view(), name='api-v2.1-metadata-global-hidden-columns'),
|
re_path(r'^global-hidden-columns/$', MetadataGlobalHiddenColumnsView.as_view(), name='api-v2.1-metadata-global-hidden-columns'),
|
||||||
|
|
||||||
# ocr
|
|
||||||
re_path(r'^ocr/', MetadataOCRManageView.as_view(), name='api-v2.1-metadata-ocr'),
|
|
||||||
|
|
||||||
# tags api
|
# tags api
|
||||||
re_path(r'^tags-status/$', MetadataTagsStatusManage.as_view(), name='api-v2.1-metadata-tags-status'),
|
re_path(r'^tags-status/$', MetadataTagsStatusManage.as_view(), name='api-v2.1-metadata-tags-status'),
|
||||||
re_path(r'^tags/$', MetadataTags.as_view(), name='api-v2.1-metadata-tags'),
|
re_path(r'^tags/$', MetadataTags.as_view(), name='api-v2.1-metadata-tags'),
|
||||||
|
@@ -896,49 +896,3 @@ class MetadataMergeTagsTest(BaseTestCase):
|
|||||||
self.assertIn(self.target_tag_id, tag_ids)
|
self.assertIn(self.target_tag_id, tag_ids)
|
||||||
self.assertNotIn(self.merge_tag_id, tag_ids)
|
self.assertNotIn(self.merge_tag_id, tag_ids)
|
||||||
|
|
||||||
|
|
||||||
class MetadataOCRManageViewTest(BaseTestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.login_as(self.user)
|
|
||||||
self.repo = seafile_api.get_repo(self.create_repo(
|
|
||||||
name='test-repo',
|
|
||||||
desc='',
|
|
||||||
username=self.user.username,
|
|
||||||
passwd=None
|
|
||||||
))
|
|
||||||
self.repo_id = self.repo.id
|
|
||||||
|
|
||||||
url = reverse('api-v2.1-metadata', args=[self.repo_id])
|
|
||||||
self.client.put(url)
|
|
||||||
|
|
||||||
def test_enable_ocr(self):
|
|
||||||
url = reverse('api-v2.1-metadata-ocr', args=[self.repo_id])
|
|
||||||
resp = self.client.put(url)
|
|
||||||
self.assertEqual(200, resp.status_code)
|
|
||||||
json_resp = json.loads(resp.content)
|
|
||||||
self.assertTrue(json_resp['success'])
|
|
||||||
|
|
||||||
metadata = RepoMetadata.objects.filter(repo_id=self.repo_id).first()
|
|
||||||
self.assertTrue(metadata.ocr_enabled)
|
|
||||||
|
|
||||||
def test_disable_ocr(self):
|
|
||||||
url = reverse('api-v2.1-metadata-ocr', args=[self.repo_id])
|
|
||||||
self.client.put(url)
|
|
||||||
|
|
||||||
resp = self.client.delete(url)
|
|
||||||
self.assertEqual(200, resp.status_code)
|
|
||||||
json_resp = json.loads(resp.content)
|
|
||||||
self.assertTrue(json_resp['success'])
|
|
||||||
|
|
||||||
metadata = RepoMetadata.objects.filter(repo_id=self.repo_id).first()
|
|
||||||
self.assertFalse(metadata.ocr_enabled)
|
|
||||||
|
|
||||||
def test_enable_ocr_without_metadata(self):
|
|
||||||
metadata = RepoMetadata.objects.filter(repo_id=self.repo_id).first()
|
|
||||||
metadata.enabled = False
|
|
||||||
metadata.save()
|
|
||||||
|
|
||||||
url = reverse('api-v2.1-metadata-ocr', args=[self.repo_id])
|
|
||||||
resp = self.client.put(url)
|
|
||||||
self.assertEqual(404, resp.status_code)
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user