1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-26 15:26:19 +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:
awu0403
2025-06-25 16:55:43 +08:00
committed by GitHub
parent a446a7bbd0
commit 4d9f9ef10c
16 changed files with 14 additions and 289 deletions

View File

@@ -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 [expanded, setExpanded] = useState(false);
const { enableOCR, enableMetadata, canModify, onOCRByImageDialog } = useMetadataAIOperations();
const { enableMetadata, canModify, onOCRByImageDialog } = useMetadataAIOperations();
const downloadImage = useCallback((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));
let onOCR = null;
if (enableOCR && enableMetadata && canModify && !isSystemFolder) {
if (enableMetadata && canModify && !isSystemFolder) {
onOCR = () => onOCRByImageDialog({ parentDir: mainImg.parentDir, fileName: mainImg.name }, document.activeElement);
}

View File

@@ -9,7 +9,6 @@ import {
MetadataStatusManagementDialog as LibExtendedPropertiesSettingPanel,
MetadataFaceRecognitionDialog as LibFaceRecognitionSettingPanel,
MetadataTagsStatusDialog as LibMetadataTagsStatusSettingPanel,
MetadataOCRStatusManagementDialog as LibMetadataOCRStatusSettingPanel,
useMetadata
} from '../../metadata';
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 { enableMetadataManagement } = window.app.pageOptions;
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 enableAutoDelSetting = is_admin && enableRepoAutoDel;
const enableExtendedPropertiesSetting = !encrypted && is_admin && enableMetadataManagement;
@@ -162,22 +161,6 @@ const LibSettingsDialog = ({ repoID, currentRepoInfo, toggleDialog, tab, showMig
{gettext('Tags')}
</NavLink>
</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>
@@ -238,18 +221,6 @@ const LibSettingsDialog = ({ repoID, currentRepoInfo, toggleDialog, tab, showMig
/>
</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>
</Fragment>
</ModalBody>

View File

@@ -10,14 +10,12 @@ import { checkIsDir } from '../../metadata/utils/row';
import { Utils } from '../../utils/utils';
import { getFileNameFromRecord } from '../../metadata/utils/cell';
import { getColumnByKey } from '../../metadata/utils/column';
import { useMetadataStatus } from '../../hooks';
import { openInNewTab, openParentFolder } from '../../metadata/utils/file';
const TableFilesToolbar = ({ repoID }) => {
const [selectedRecordIds, setSelectedRecordIds] = useState([]);
const metadataRef = useRef([]);
const menuRef = useRef(null);
const { enableOCR } = useMetadataStatus();
const canModify = window.sfMetadataContext && window.sfMetadataContext.canModify();
const eventBus = window.sfMetadataContext && window.sfMetadataContext.eventBus;
@@ -95,7 +93,7 @@ const TableFilesToolbar = ({ repoID }) => {
aiOptions.push(GENERATE_DESCRIPTION);
}
if (enableOCR && (isImage || isPDF)) {
if (isImage || isPDF) {
aiOptions.push(OCR);
}
@@ -105,7 +103,7 @@ const TableFilesToolbar = ({ repoID }) => {
}
}
return list;
}, [selectedRecordIds, records, enableOCR]);
}, [selectedRecordIds, records]);
const onMenuItemClick = useCallback((operation) => {
const records = selectedRecordIds.map(id => RowUtils.getRecordById(id, metadataRef.current)).filter(Boolean);

View File

@@ -3,8 +3,7 @@ const TAB = {
AUTO_DEL_SETTING: 'auto_delete_setting',
EXTENDED_PROPERTIES_SETTING: 'extended_properties_setting',
FACE_RECOGNITION_SETTING: 'face_recognition_setting',
TAGS_SETTING: 'tags_setting',
OCR_SETTING: 'ocr_setting',
TAGS_SETTING: 'tags_setting'
};
export { TAB };

View File

@@ -22,7 +22,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
const [enableMetadata, setEnableMetadata] = useState(false);
const [enableTags, setEnableTags] = useState(false);
const [tagsLang, setTagsLang] = useState('en');
const [enableOCR, setEnableOCR] = useState(false);
const [detailsSettings, setDetailsSettings] = useState({});
const [isBeingBuilt, setIsBeingBuilt] = useState(false);
const [enableFaceRecognition, setEnableFaceRecognition] = useState(false);
@@ -44,7 +43,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
setLoading(true);
setEnableMetadata(false);
setEnableTags(false);
setEnableOCR(false);
setEnableFaceRecognition(false);
setDetailsSettings({});
setIsBeingBuilt(false);
@@ -59,7 +57,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
tags_enabled: enableTags,
tags_lang: tagsLang,
details_settings: detailsSettings,
ocr_enabled: enableOCR,
face_recognition_enabled: enableFaceRecognition,
global_hidden_columns: globalHiddenColumns,
} = res.data;
@@ -69,7 +66,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
setEnableTags(enableTags);
setTagsLang(tagsLang || 'en');
setDetailsSettings(JSON.parse(detailsSettings));
setEnableOCR(enableSeafileAI && enableOCR);
setEnableFaceRecognition(enableSeafileAI && enableFaceRecognition);
setEnableMetadata(enableMetadata);
const parsedGlobalHiddenColumns = typeof globalHiddenColumns === 'string'
@@ -96,7 +92,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
if (!newValue) {
cancelMetadataURL(true);
setEnableTags(false);
setEnableOCR(false);
setEnableFaceRecognition(false);
}
setDetailsSettings({});
@@ -115,10 +110,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
setTagsLang(lang);
}, [enableTags, tagsLang, cancelMetadataURL]);
const updateEnableOCR = useCallback((newValue) => {
if (newValue === enableOCR) return;
setEnableOCR(newValue);
}, [enableOCR]);
const updateEnableFaceRecognition = useCallback((newValue) => {
if (newValue === enableFaceRecognition) return;
@@ -169,8 +160,6 @@ export const MetadataStatusProvider = ({ repoID, repoInfo, currentPath, hideMeta
updateEnableTags,
detailsSettings,
modifyDetailsSettings,
enableOCR,
updateEnableOCR,
enableFaceRecognition,
updateEnableFaceRecognition,
globalHiddenColumns,

View File

@@ -393,16 +393,6 @@ class MetadataManagerAPI {
};
// 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) => {
const url = this.server + '/api/v2.1/ai/ocr/';
const params = {

View File

@@ -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;

View File

@@ -22,7 +22,7 @@ const AIIcon = () => {
const [isMenuShow, setMenuShow] = useState(false);
const { enableMetadata, enableTags, enableOCR } = useMetadataStatus();
const { enableMetadata, enableTags } = useMetadataStatus();
const { canModifyRecord, columns, record, onChange, onLocalRecordChange, updateFileTags, updateDescription } = useMetadataDetails();
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 });
}
@@ -57,7 +57,7 @@ const AIIcon = () => {
}
return list;
}, [enableOCR, enableTags, canModifyRecord, columns, record]);
}, [enableTags, canModifyRecord, columns, record]);
const onToggle = useCallback((event) => {
event && event.preventDefault();

View File

@@ -13,7 +13,6 @@ const MetadataAIOperationsContext = React.createContext(null);
export const MetadataAIOperationsProvider = ({
repoID,
enableMetadata = false,
enableOCR = false,
enableTags = false,
tagsLang,
repoInfo,
@@ -140,7 +139,6 @@ export const MetadataAIOperationsProvider = ({
return (
<MetadataAIOperationsContext.Provider value={{
enableMetadata,
enableOCR,
enableTags,
tagsLang,
canModify,

View File

@@ -7,7 +7,7 @@ import { useMetadataStatus } from '../../hooks';
const MetadataMiddlewareContext = React.createContext(null);
export const MetadataMiddlewareProvider = ({ repoID, currentPath, repoInfo, selectTagsView, tagsChangedCallback, children }) => {
const { enableMetadata, enableOCR, enableTags, tagsLang } = useMetadataStatus();
const { enableMetadata, enableTags, tagsLang } = useMetadataStatus();
return (
<MetadataMiddlewareContext.Provider value={{}}>
@@ -16,7 +16,6 @@ export const MetadataMiddlewareProvider = ({ repoID, currentPath, repoInfo, sele
<MetadataAIOperationsProvider
repoID={repoID}
enableMetadata={enableMetadata}
enableOCR={enableOCR}
enableTags={enableTags}
tagsLang={tagsLang}
repoInfo={repoInfo}

View File

@@ -4,7 +4,6 @@ export { default as SeafileMetadata } from './views';
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 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 MetadataTreeView } from './metadata-tree-view';
export { default as metadataAPI } from './api';

View File

@@ -1,6 +1,5 @@
import React, { useState, useRef, useCallback, useMemo } from 'react';
import PropTypes from 'prop-types';
import { useMetadataStatus } from '@/hooks';
import { gettext, enableSeafileAI } from '@/utils/constants';
import { Utils } from '@/utils/utils';
import DeleteFolderDialog from '@/components/dialog/delete-folder-dialog';
@@ -41,7 +40,6 @@ const ContextMenu = ({
const [deletedFolderPath, setDeletedFolderPath] = useState('');
const { metadata } = useMetadataView();
const { enableOCR } = useMetadataStatus();
const repoID = window.sfMetadataStore.repoId;
@@ -220,7 +218,7 @@ const ContextMenu = ({
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 });
}
@@ -231,7 +229,7 @@ const ContextMenu = ({
}
return list;
}, [isGroupView, selectedPosition, recordMetrics, selectedRange, metadata, recordGetterByIndex, checkIsDescribableFile, enableOCR, getAbleDeleteRecords]);
}, [isGroupView, selectedPosition, recordMetrics, selectedRange, metadata, recordGetterByIndex, checkIsDescribableFile, getAbleDeleteRecords]);
const handleOptionClick = useCallback((option, event) => {
switch (option.value) {

View File

@@ -762,7 +762,7 @@ class SharedDirView extends React.Component {
const isRepoInfoBarShown = isDesktop && path == '/' && usedRepoTags.length != 0;
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 className="top-header d-flex justify-content-between flex-shrink-0">
<a href={siteRoot}>

View File

@@ -55,7 +55,6 @@ class MetadataManage(APIView):
is_tags_enabled = False
tags_lang = ''
details_settings = '{}'
is_ocr_enabled = False
face_recognition_enabled = False
global_hidden_columns = []
@@ -70,8 +69,6 @@ class MetadataManage(APIView):
if record.tags_enabled:
is_tags_enabled = True
tags_lang = record.tags_lang
if record.ocr_enabled:
is_ocr_enabled = True
if record.face_recognition_enabled:
face_recognition_enabled = True
if not global_hidden_columns:
@@ -84,7 +81,6 @@ class MetadataManage(APIView):
return Response({
'enabled': is_enabled,
'tags_enabled': is_tags_enabled,
'ocr_enabled': is_ocr_enabled,
'face_recognition_enabled': face_recognition_enabled,
'tags_lang': tags_lang,
'details_settings': details_settings,
@@ -173,7 +169,6 @@ class MetadataManage(APIView):
record.face_recognition_enabled = False
record.tags_enabled = False
record.details_settings = '{}'
record.ocr_enabled = False
record.save()
RepoMetadataViews.objects.filter(repo_id=repo_id).delete()
except Exception as e:
@@ -256,66 +251,6 @@ class MetadataGlobalHiddenColumnsView(APIView):
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):
authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated, )

View File

@@ -3,7 +3,7 @@ from .apis import MetadataRecognizeFaces, MetadataRecords, MetadataManage, Metad
MetadataFolders, MetadataViews, MetadataViewsMoveView, MetadataViewsDetailView, MetadataViewsDuplicateView, FacesRecords, \
FaceRecognitionManage, FacesRecord, MetadataExtractFileDetails, PeoplePhotos, MetadataTagsStatusManage, MetadataTags, \
MetadataTagsLinks, MetadataFileTags, MetadataTagFiles, MetadataMergeTags, MetadataTagsFiles, MetadataDetailsSettingsView, \
MetadataOCRManageView, PeopleCoverPhoto, MetadataMigrateTags, MetadataExportTags, MetadataImportTags, MetadataGlobalHiddenColumnsView
PeopleCoverPhoto, MetadataMigrateTags, MetadataExportTags, MetadataImportTags, MetadataGlobalHiddenColumnsView
urlpatterns = [
re_path(r'^$', MetadataManage.as_view(), name='api-v2.1-metadata'),
@@ -35,9 +35,6 @@ urlpatterns = [
# 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
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'),

View File

@@ -896,49 +896,3 @@ class MetadataMergeTagsTest(BaseTestCase):
self.assertIn(self.target_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)