-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathviews.py
More file actions
140 lines (112 loc) · 4.68 KB
/
Copy pathviews.py
File metadata and controls
140 lines (112 loc) · 4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
from django.shortcuts import render, redirect, get_object_or_404
from django.http import JsonResponse
from .forms import DocumentUploadForm
from .models import Document, VerificationError
import pytesseract
import cv2
import tempfile, os
def document_upload(request):
"""
Handle multiple image uploads (via form) and run OCR on each.
"""
if request.method == 'POST':
files = request.FILES.getlist('image') # get multiple files
document_type = request.POST.get('document_type', 'Unknown')
if not files:
return render(request, 'verification/index.html', {
'form': DocumentUploadForm(),
'error': 'No files uploaded.'
})
# Create parent Document
doc = Document.objects.create(document_type=document_type, verification_status='pending')
results = []
has_error = False
combined_text = ""
for f in files:
# Save temporarily
temp_path = os.path.join(tempfile.gettempdir(), f.name)
with open(temp_path, 'wb+') as dest:
for chunk in f.chunks():
dest.write(chunk)
# Run OCR
img = cv2.imread(temp_path)
extracted_text = pytesseract.image_to_string(img)
results.append({"filename": f.name, "text": extracted_text})
combined_text += f"\n\n---- {f.name} ----\n{extracted_text}"
# Rule check
if "error" in extracted_text.lower():
has_error = True
VerificationError.objects.create(
document=doc,
error_description=f"Detected error in {f.name}",
notified_admin=False
)
# Save combined OCR text in DB (for reference)
doc.extracted_text = combined_text
doc.verification_status = 'error' if has_error else 'verified'
doc.save()
return render(request, 'verification/result.html', {
'document': doc,
'errors': VerificationError.objects.filter(document=doc),
'results': results
})
else:
form = DocumentUploadForm()
return render(request, 'verification/index.html', {'form': form})
def verify_document(request):
"""
API endpoint for JSON-based verification.
Accepts multiple images + document_type, returns JSON response.
"""
if request.method == 'POST':
files = request.FILES.getlist('images')
document_type = request.POST.get('document_type', 'Unknown')
if not files:
return JsonResponse({'status': 'error', 'message': 'No images uploaded'}, status=400)
doc = Document.objects.create(document_type=document_type, verification_status='pending')
results = []
has_error = False
combined_text = ""
for f in files:
temp_path = os.path.join(tempfile.gettempdir(), f.name)
with open(temp_path, 'wb+') as dest:
for chunk in f.chunks():
dest.write(chunk)
img = cv2.imread(temp_path)
extracted_text = pytesseract.image_to_string(img)
results.append({"filename": f.name, "text": extracted_text})
combined_text += f"\n\n---- {f.name} ----\n{extracted_text}"
if "error" in extracted_text.lower():
has_error = True
VerificationError.objects.create(
document=doc,
error_description=f"Detected error in {f.name}",
notified_admin=False
)
doc.extracted_text = combined_text
doc.verification_status = 'error' if has_error else 'verified'
doc.save()
return JsonResponse({
'status': 'error' if has_error else 'success',
'document_id': doc.id,
'message': 'Errors detected' if has_error else 'All documents verified successfully',
'files': results
})
return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)
def verification_result(request, doc_id):
"""
Display the verification result for a document.
"""
doc = get_object_or_404(Document, id=doc_id)
errors = VerificationError.objects.filter(document=doc)
# split stored text just in case, but normally results come from upload
results = []
if doc.extracted_text:
for block in doc.extracted_text.split("----"):
if block.strip():
results.append({"filename": "Unknown", "text": block.strip()})
return render(request, 'verification/result.html', {
'document': doc,
'errors': errors,
'results': results
})