Skip to content

Commit 0e97178

Browse files
authored
feat: skip OCR (#332)
1 parent eded5b5 commit 0e97178

File tree

8 files changed

+47
-13
lines changed

8 files changed

+47
-13
lines changed

papermerge/core/routers/nodes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ def create_node(
114114
parent_id=pynode.parent_id,
115115
size=0,
116116
page_count=0,
117+
ocr=pynode.ocr,
117118
file_name=pynode.title
118119
)
119120
if pynode.id:

papermerge/core/schemas/documents.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ class CreateDocument(BaseModel):
134134
parent_id: UUID | None
135135
lang: str | None = None
136136
file_name: str | None = None
137+
# Will OCR be triggered immediately?
138+
# True: means, yes, trigger OCR after upload
139+
# False: means, skip OCR
140+
ocr: bool = True
137141

138142
model_config = {
139143
"json_schema_extra": {

papermerge/core/signals.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,11 @@ def receiver_document_post_upload(
212212
"""
213213
doc_ver = document_version
214214
doc = document_version.document
215+
216+
if not doc.ocr:
217+
logger.info(f"Skipping OCR for doc={doc} as doc.ocr=False")
218+
return
219+
215220
user = doc.user
216221

217222
logger.debug(

ui/src/components/commander/commander.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ function Commander({
557557
onEditTagsClick={onEditTagsClick}
558558
onCreatedNodesByUpload={onCreatedNodesByUpload}
559559
selected_nodes={selected_nodes}
560-
node_id={node_id} />
560+
target={nodes!.data!.parent} />
561561

562562
<div className="d-flex align-items-center">
563563
<SortDropdown

ui/src/components/commander/menu/Menu.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import UploadButton from './UploadButton';
22
import NewFolder from './NewFolder';
33

4-
import type { CreatedNodesType, NodeType } from 'types';
4+
import type { CreatedNodesType, FolderType, NodeType } from 'types';
55
import DeleteNodes from './DeleteNodes';
66
import RenameNodes from './RenameNode';
77
import EditTags from './EditTags';
@@ -14,7 +14,7 @@ type Args = {
1414
onEditTagsClick: () => void;
1515
onCreatedNodesByUpload: (created_nodes: CreatedNodesType) => void;
1616
selected_nodes: Array<string>;
17-
node_id: string; // current node id
17+
target: FolderType; // current node id
1818
}
1919

2020
function Menu({
@@ -24,10 +24,10 @@ function Menu({
2424
onEditTagsClick,
2525
onCreatedNodesByUpload,
2626
selected_nodes,
27-
node_id
27+
target
2828
}: Args) {
2929

30-
const upload = <UploadButton node_id={node_id} onCreatedNodesByUpload={onCreatedNodesByUpload} />;
30+
const upload = <UploadButton target={target} onCreatedNodesByUpload={onCreatedNodesByUpload} />;
3131
const new_folder = <NewFolder onClick={onNewFolderClick} />;
3232
const delete_nodes = <DeleteNodes onClick={onDeleteNodesClick} />;
3333
const rename_node = <RenameNodes onClick={onRenameClick} />;

ui/src/components/commander/menu/UploadButton.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import Button from 'react-bootstrap/Button';
2-
import { uploader } from 'utils/uploader';
32
import Tooltip from 'react-bootstrap/Tooltip';
3+
import drop_files from '../modals/DropFiles';
44

55
import { OverlayTrigger } from 'react-bootstrap';
6-
import { CreatedNodesType } from 'types';
6+
import { CreatedNodesType, FolderType } from 'types';
77

88
type Args = {
9-
node_id: string;
9+
target: FolderType;
1010
onCreatedNodesByUpload: (created_nodes: CreatedNodesType) => void;
1111
}
1212

13-
function UploadButton({node_id, onCreatedNodesByUpload}: Args) {
13+
function UploadButton({target, onCreatedNodesByUpload}: Args) {
1414

1515
const onClickProxyUpload = () => {
1616
let element: HTMLInputElement | null = document.querySelector('input[type=file]');
@@ -30,7 +30,10 @@ function UploadButton({node_id, onCreatedNodesByUpload}: Args) {
3030
return;
3131
}
3232

33-
uploader({files, node_id}).then(
33+
drop_files({
34+
source_files: files,
35+
target: target
36+
}).then(
3437
(created_nodes: CreatedNodesType) => {
3538
onCreatedNodesByUpload(created_nodes);
3639
}

ui/src/components/commander/modals/DropFiles.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import { useState } from 'react';
2+
import Form from 'react-bootstrap/Form';
3+
14
import { MODALS } from 'cconstants';
25
import GenericModal from 'components/modals/Generic';
36
import { uploader } from 'utils/uploader';
@@ -29,10 +32,19 @@ const DropFilesModal = ({
2932
files from some folder - it does not make any sense for the upload dialog to
3033
be open for until all those 200 files get uploaded.
3134
*/
35+
const [skipOCR, setSkipOCR] = useState<boolean>(false);
36+
37+
const onLocalCheck = () => {
38+
let new_checked_value = !skipOCR;
39+
40+
setSkipOCR(new_checked_value);
41+
}
42+
3243
const handleSubmit = async () => {
3344
uploader({
3445
files: source_files,
35-
node_id: target.id
46+
node_id: target.id,
47+
skip_ocr: skipOCR
3648
})
3749
.then(
3850
(drop_files: CreatedNodesType) => onOK(drop_files)
@@ -56,6 +68,12 @@ const DropFilesModal = ({
5668
Are you sure you want to upload <span className='text-primary'>
5769
{source_titles.join(', ')}
5870
</span> to <span className='text-success'>{target_title}</span>?
71+
<p className='pt-3'>
72+
<Form.Check
73+
onChange={onLocalCheck}
74+
type="checkbox"
75+
label={`Skip OCR`} />
76+
</p>
5977
</GenericModal>
6078
);
6179
}

ui/src/utils/uploader.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,26 @@ import type { CreatedNodesType, NodeType } from 'types';
55
type UploaderArgs = {
66
files: FileList;
77
node_id: string;
8+
skip_ocr: boolean;
89
}
910

1011
type CreateDocumentType = {
1112
title: string;
1213
parent_id: string;
1314
ctype: 'document';
15+
ocr: boolean;
1416
}
1517

1618

17-
async function uploader({files, node_id}: UploaderArgs): Promise<CreatedNodesType> {
19+
async function uploader({files, node_id, skip_ocr}: UploaderArgs): Promise<CreatedNodesType> {
1820
let bulk_create_docs: any = [];
1921

2022
Array.from(files, (file) => {
2123
let data: CreateDocumentType = {
2224
title: file.name,
2325
parent_id: node_id,
24-
ctype: 'document'
26+
ctype: 'document',
27+
ocr: !skip_ocr
2528
}
2629

2730
bulk_create_docs.push(

0 commit comments

Comments
 (0)