74 lines
3.7 KiB
Python
74 lines
3.7 KiB
Python
# myapp/management/commands/mycustomcommand.py
|
|
from django.core.management.base import BaseCommand
|
|
from tqdm import tqdm
|
|
from fwd_api.models import SubscriptionRequestFile, SubscriptionRequest
|
|
from fwd_api.exception.exceptions import InvalidException
|
|
from fwd_api.utils.accuracy import predict_result_to_ready
|
|
import traceback
|
|
import copy
|
|
from django.utils import timezone
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Move predict result to image level'
|
|
|
|
def add_arguments(self, parser):
|
|
# Add your command-line arguments here
|
|
parser.add_argument('start', type=str, help='start date, sample: 2023-01-02T00:00:00+0700')
|
|
parser.add_argument('end', type=str, help='end date, sample: 2023-01-03T00:00:00+0700')
|
|
|
|
def process_request(self, request):
|
|
if len(request.request_id.split(".")[0].split("_")) < 2:
|
|
return
|
|
images = SubscriptionRequestFile.objects.filter(request=request)
|
|
time_cost = {"imei": [], "invoice": [], "all": []}
|
|
if request.ai_inference_profile is None:
|
|
time_cost["imei"] = [-1 for _ in range(len(images))]
|
|
time_cost["invoice"] = [-1]
|
|
time_cost["all"] = [-1]
|
|
else:
|
|
for k, v in request.ai_inference_profile.items():
|
|
time_cost[k.split("_")[0]].append(v["inference"][1][0] - v["inference"][0] + (v["postprocess"][1]-v["postprocess"][0]))
|
|
for i, image in enumerate(images):
|
|
try:
|
|
image.index_in_request = int(image.file_name.split(".")[0].split("_")[-1]) if len(image.file_name.split(".")[0].split("_")) > 4 else 0
|
|
image.doc_type = image.file_name.split(".")[0].split("_")[1] if len(image.file_name.split(".")[0].split("_")) > 4 else "all"
|
|
image.processing_time = time_cost[image.doc_type][image.index_in_request]
|
|
if not request.predict_result:
|
|
self.stdout.write(self.style.WARNING(f"Key predict_result not found in {request.request_id}"))
|
|
return
|
|
if request.predict_result.get("status", 200) != 200:
|
|
self.stdout.write(self.style.WARNING(f"Failed request: {request.request_id}"))
|
|
return
|
|
_predict_result = copy.deepcopy(predict_result_to_ready(request.predict_result))
|
|
|
|
if image.doc_type == "invoice":
|
|
_predict_result["imei_number"] = []
|
|
else:
|
|
_predict_result = {"retailername": None, "sold_to_party": None, "purchase_date": [], "imei_number": [_predict_result["imei_number"][image.index_in_request]]}
|
|
image.predict_result = _predict_result
|
|
image.save()
|
|
except Exception as e:
|
|
self.stdout.write(self.style.ERROR(f"Request: {request.request_id} failed with {e}"))
|
|
print(traceback.format_exc())
|
|
continue
|
|
|
|
def handle(self, *args, **options):
|
|
start = options['start']
|
|
end = options['end']
|
|
|
|
if start or end:
|
|
try:
|
|
start_date = timezone.datetime.strptime(start, '%Y-%m-%dT%H:%M:%S%z')
|
|
end_date = timezone.datetime.strptime(end, '%Y-%m-%dT%H:%M:%S%z')
|
|
except Exception as e:
|
|
print(f"[INFO]: start: {start}")
|
|
print(f"[INFO]: end: {end}")
|
|
raise InvalidException(excArgs="Date format")
|
|
subcription_iter = SubscriptionRequest.objects.filter(created_at__range=(start_date, end_date))
|
|
else:
|
|
subcription_iter = SubscriptionRequest.objects.all()
|
|
|
|
for request in tqdm(subcription_iter.iterator()):
|
|
self.process_request(request)
|
|
self.stdout.write(self.style.SUCCESS('Sample Django management command executed successfully!'))
|