Plankton_Detector/PlanktonDetector/DetectionApp/views.py

84 lines
2.9 KiB
Python
Raw Normal View History

2023-12-13 02:11:29 +01:00
from typing import Any
from django.db.models.query import QuerySet
2023-12-06 18:12:31 +01:00
from django.shortcuts import render, redirect
from django.views import View
from .forms import DetectForm
2023-12-13 02:11:29 +01:00
from django.views.generic import ListView, DetailView
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from .models import UploadImage, PredictedImage
from .utils import predict_image
from django.contrib.auth.mixins import LoginRequiredMixin
2023-12-06 18:12:31 +01:00
class DetectView(View):
form_class = DetectForm
template_name = "upload.html"
def get(self, request, *args, **kwargs):
form = self.form_class()
return render(request, "upload.html", {"form": form})
2023-12-06 18:12:31 +01:00
2023-12-13 02:11:29 +01:00
@method_decorator(login_required)
2023-12-06 18:12:31 +01:00
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, request.FILES)
2023-12-19 17:33:46 +01:00
files = request.FILES.getlist("image")
predictions = []
2023-12-06 18:12:31 +01:00
if form.is_valid():
2023-12-19 17:33:46 +01:00
for f in files:
image = UploadImage(
image=f,
)
image.owner = request.user
image.save()
prediciton_results = predict_image(image)
image.predicted_image_url = (
f"{image.image.name}_predicted/{image.image.name.split('/')[-1]}"
)
image.save()
try:
results_metrics = prediciton_results[0]
except IndexError as e:
PredictedImage.objects.create(
original_image=image,
image=image.predicted_image_url,
confidence=0.0,
class_name="no predictions",
)
else:
PredictedImage.objects.create(
original_image=image,
image=image.predicted_image_url,
confidence=results_metrics["confidence"],
class_name=results_metrics["name"],
)
predictions.append(image)
2023-12-06 18:12:31 +01:00
return render(
request,
2023-12-19 17:33:46 +01:00
"results.html",
2023-12-06 18:12:31 +01:00
{
2023-12-13 02:11:29 +01:00
"img_saved": True,
2023-12-19 17:33:46 +01:00
"img_url": predictions,
2023-12-06 18:12:31 +01:00
},
)
else:
return render(request, "upload.html", {"form": form})
2023-12-13 02:11:29 +01:00
class ListHistory(LoginRequiredMixin, ListView):
model = PredictedImage
queryset = PredictedImage.objects.all()
template_name = "history.html"
2023-12-19 17:33:46 +01:00
paginate_by = 3
2023-12-06 18:12:31 +01:00
2023-12-13 02:11:29 +01:00
def get_queryset(self) -> QuerySet[Any]:
queryset = PredictedImage.objects.filter(
original_image__owner=self.request.user
).order_by("-date_predicted")
return queryset
2023-12-06 18:12:31 +01:00
2023-12-13 02:11:29 +01:00
class DetectionDetails(LoginRequiredMixin, DetailView):
model = PredictedImage
template_name = "detection_detail.html"