from proctoring.services.mrz_extractor import extract_mrz_info from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden import cv2 import numpy as np import base64 import os from django.views.decorators.csrf import csrf_exempt import json import datetime from django.conf import settings from django.core.files.base import ContentFile from proctoring.models.image import Image from proctoring.models.imageTypes import ImageTypes @csrf_exempt def CheckId(request): if request.method != "POST": return HttpResponseForbidden("Only POST requests are allowed") try: data = json.loads(request.body) idFront = data.get("idfront", "") idBack = data.get("idback", "") shareId = data.get("shareId", "") except json.JSONDecodeError: return HttpResponseBadRequest("Invalid JSON data") if idFront == "" or idBack == "" or shareId == "": return HttpResponseBadRequest("Missing parameters") name,expiryDate = extract_mrz_info(idFront) if name is None or expiryDate is None: name,expiryDate= extract_mrz_info(idBack) if name is None or expiryDate is None: response = {"pass": False, "message":"None valid ID was provided!"} return HttpResponse(json.dumps(response)) today = datetime.datetime.today() date_format = '%Y-%m-%d' date_obj = datetime.datetime.strptime(expiryDate, date_format) if today >date_obj: response = {"pass": False, "message":"Expired ID was provided!"} return HttpResponse(json.dumps(response)) frontImg_bytes = base64.b64decode(idFront) frontImg_np = np.frombuffer(frontImg_bytes, dtype=np.uint8) frontImg = cv2.imdecode(frontImg_np, cv2.IMREAD_COLOR) backImg_bytes = base64.b64decode(idBack) backImg_np = np.frombuffer(backImg_bytes, dtype=np.uint8) backImg = cv2.imdecode(backImg_np, cv2.IMREAD_COLOR) frontNewWidth = int(frontImg.shape[0]*0.37) frontNewHeight = int(frontImg.shape[1]*0.37) frontImg=cv2.resize(frontImg,(frontNewHeight,frontNewWidth),interpolation=cv2.INTER_AREA) backNewWidth = int(backImg.shape[0]*0.37) backNewHeight = int(backImg.shape[1]*0.37) backImg=cv2.resize(backImg,(backNewHeight,backNewWidth),interpolation=cv2.INTER_AREA) idFront_save = cv2.imencode(".jpg", frontImg)[1].tobytes() idBack_save = cv2.imencode(".jpg", backImg)[1].tobytes() save_folder = os.path.join("proctoring_images", shareId) identity_folder = os.path.join(save_folder, "identity-check", "id") frontFilename = "Front {date:%Y-%m-%d_%H.%M.%S}.jpg".format(date=datetime.datetime.now()) frontFilepath = os.path.join(identity_folder, frontFilename) frontContent_file = ContentFile(idFront_save, name=frontFilename) frontFilepath = settings.s3_storage.save(os.path.join(frontFilepath), frontContent_file) frontImage = Image( path=f"{settings.AWS_S3_ACCESS_DOMAIN}/{frontFilepath}", personCount=0, prohibitedObjectsCount=0, type=ImageTypes.IdCheck, shareId=shareId ) frontImage.save() backFilename = "Back {date:%Y-%m-%d_%H.%M.%S}.jpg".format(date=datetime.datetime.now()) backFilepath = os.path.join(identity_folder, backFilename) backContent_file = ContentFile(idBack_save, name=backFilename) backFilepath = settings.s3_storage.save(os.path.join(backFilepath), backContent_file) backImage = Image( path=f"{settings.AWS_S3_ACCESS_DOMAIN}/{backFilepath}", personCount=0, prohibitedObjectsCount=0, type=ImageTypes.IdCheck, shareId=shareId ) backImage.save() response = {"pass": True, "name":name, "expiryDate":expiryDate} return HttpResponse(json.dumps(response))