ohtu2021-kvantti/WebMark

View on GitHub
WebCLI/views/worker_api.py

Summary

Maintainability
C
1 day
Test Coverage
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from ..models import Metrics, Average_history, Accuracy_history
from django.utils import timezone
import json
from WebMark.settings import API_KEY


def as_metrics(result):
    metrics = Metrics.objects.get(pk=result["metrics_id"])
    metrics.qubit_count = result["qubit_count"]
    metrics.timestamp = timezone.now()
    metrics.gate_depth = result["gate_depth"]
    metrics.average_iterations = result["average_iterations"]
    metrics.success_rate = result["success_rate"]
    metrics.in_analyze_queue = False
    metrics.last_analyze_ok = True
    return metrics


def as_average_history(result):
    histories = result["average_history"]
    for i in range(len(histories)):
        average_history = Average_history(
            metrics=Metrics.objects.get(pk=result["metrics_id"]),
            data=histories[i],
            iteration_number=i)
        average_history.save()
    return average_history


def as_accuracy_history(result):
    histories = result["accuracy_history"]
    for i in range(len(histories)):
        accuracy_history = Accuracy_history(
            metrics=Metrics.objects.get(pk=result["metrics_id"]),
            data=histories[i],
            iteration_number=i)
        accuracy_history.save()
    return accuracy_history


def has_permission(request):
    token = request.headers.get("Authorization")
    return token == API_KEY


@csrf_exempt
def handle_result(request):
    if not has_permission(request):
        print("ACCESS DENIED")
        return HttpResponse("ok")
    if "error" in request.POST:
        metrics = Metrics.objects.get(pk=int(request.POST["metrics_id"]))
        metrics.last_analyze_ok = False
        metrics.in_analyze_queue = False
        metrics.save()
        return HttpResponse("error")
    metrics = json.loads(request.POST["data"], object_hook=as_metrics)
    metrics.save()
    Average_history.objects.filter(metrics=metrics).delete()
    Accuracy_history.objects.filter(metrics=metrics).delete()
    json.loads(request.POST["data"], object_hook=as_average_history)
    json.loads(request.POST["data"], object_hook=as_accuracy_history)
    return HttpResponse("ok")