devicehub-django/device/views.py

242 lines
7.4 KiB
Python
Raw Normal View History

from django.http import JsonResponse
2024-12-05 09:54:41 +00:00
from django.conf import settings
2024-07-05 13:32:07 +00:00
from django.urls import reverse_lazy
2024-09-25 17:04:29 +00:00
from django.shortcuts import get_object_or_404, Http404
2024-07-05 13:32:07 +00:00
from django.utils.translation import gettext_lazy as _
from django.views.generic.edit import (
CreateView,
UpdateView,
2024-07-19 15:40:01 +00:00
FormView,
2024-07-05 13:32:07 +00:00
)
2024-07-15 14:23:14 +00:00
from django.views.generic.base import TemplateView
from dashboard.mixins import DashboardView, Http403
2024-07-30 11:37:08 +00:00
from evidence.models import Annotation
2024-07-18 15:21:22 +00:00
from lot.models import LotTag
from device.models import Device
2024-07-19 15:40:01 +00:00
from device.forms import DeviceFormSet
2024-12-05 09:54:41 +00:00
if settings.DPP:
from dpp.models import Proof
from dpp.api_dlt import PROOF_TYPE
2024-07-05 13:32:07 +00:00
2024-07-19 15:40:01 +00:00
class NewDeviceView(DashboardView, FormView):
2024-07-05 13:32:07 +00:00
template_name = "new_device.html"
title = _("New Device")
breadcrumb = "Device / New Device"
success_url = reverse_lazy('dashboard:unassigned_devices')
2024-07-19 15:40:01 +00:00
form_class = DeviceFormSet
2024-07-05 13:32:07 +00:00
def form_valid(self, form):
2024-07-23 13:37:40 +00:00
form.save(self.request.user)
2024-07-05 13:32:07 +00:00
response = super().form_valid(form)
return response
2024-07-18 15:21:22 +00:00
2024-07-22 11:48:10 +00:00
def form_invalid(self, form):
response = super().form_invalid(form)
return response
2024-07-05 13:32:07 +00:00
2024-07-19 15:40:01 +00:00
# class AddToLotView(DashboardView, FormView):
# template_name = "list_lots.html"
# title = _("Add to lots")
# breadcrumb = "lot / add to lots"
# success_url = reverse_lazy('dashboard:unassigned_devices')
# form_class = LotsForm
# def get_context_data(self, **kwargs):
# context = super().get_context_data(**kwargs)
# lots = Lot.objects.filter(owner=self.request.user)
# lot_tags = LotTag.objects.filter(owner=self.request.user)
# context.update({
# 'lots': lots,
# 'lot_tags':lot_tags,
# })
# return context
# def get_form(self):
# form = super().get_form()
# form.fields["lots"].queryset = Lot.objects.filter(owner=self.request.user)
# return form
# def form_valid(self, form):
# form.devices = self.get_session_devices()
# form.save()
# response = super().form_valid(form)
# return response
2024-07-08 10:59:32 +00:00
class EditDeviceView(DashboardView, UpdateView):
template_name = "new_device.html"
title = _("Update Device")
breadcrumb = "Device / Update Device"
success_url = reverse_lazy('dashboard:unassigned_devices')
2024-07-19 15:40:01 +00:00
model = Annotation
2024-07-08 10:59:32 +00:00
def get_form_kwargs(self):
pk = self.kwargs.get('pk')
self.object = get_object_or_404(
self.model,
pk=pk,
owner=self.request.user.institution
)
2024-07-08 10:59:32 +00:00
self.success_url = reverse_lazy('device:details', args=[pk])
kwargs = super().get_form_kwargs()
return kwargs
2024-07-05 13:32:07 +00:00
2024-07-19 15:40:01 +00:00
class DetailsView(DashboardView, TemplateView):
2024-07-15 14:23:14 +00:00
template_name = "details.html"
title = _("Device")
breadcrumb = "Device / Details"
2024-07-19 15:40:01 +00:00
model = Annotation
def get(self, request, *args, **kwargs):
self.pk = kwargs['pk']
self.object = Device(id=self.pk)
2024-09-25 17:04:29 +00:00
if not self.object.last_evidence:
raise Http404
if self.object.owner != self.request.user.institution:
raise Http403
2024-10-22 05:35:47 +00:00
2024-07-19 15:40:01 +00:00
return super().get(request, *args, **kwargs)
2024-07-15 14:23:14 +00:00
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.object.initial()
2024-09-18 16:01:46 +00:00
lot_tags = LotTag.objects.filter(owner=self.request.user.institution)
2024-12-05 09:54:41 +00:00
dpps = []
if settings.DPP:
dpps = Proof.objects.filter(
uuid__in=self.object.uuids,
type=PROOF_TYPE["IssueDPP"]
)
2024-07-15 14:23:14 +00:00
context.update({
2024-07-19 15:40:01 +00:00
'object': self.object,
2024-07-30 11:37:08 +00:00
'snapshot': self.object.get_last_evidence(),
2024-07-18 15:21:22 +00:00
'lot_tags': lot_tags,
'dpps': dpps,
2024-07-15 14:23:14 +00:00
})
return context
2024-07-05 13:32:07 +00:00
2024-10-22 07:18:59 +00:00
class PublicDeviceWebView(TemplateView):
2024-10-08 05:26:48 +00:00
template_name = "device_web.html"
def get(self, request, *args, **kwargs):
self.pk = kwargs['pk']
self.object = Device(id=self.pk)
2024-10-30 15:00:23 +00:00
if not self.object.last_evidence:
raise Http404
if self.request.headers.get('Accept') == 'application/json':
return self.get_json_response()
2024-10-08 05:26:48 +00:00
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.object.initial()
context.update({
2024-10-23 06:47:40 +00:00
'object': self.object
2024-10-08 05:26:48 +00:00
})
return context
@property
def public_fields(self):
return {
2024-10-23 06:47:40 +00:00
'id': self.object.id,
'shortid': self.object.shortid,
'uuids': self.object.uuids,
'hids': self.object.hids,
2024-11-06 16:21:48 +00:00
'components': self.remove_serial_number_from(self.object.components),
}
@property
def authenticated_fields(self):
return {
'serial_number': self.object.serial_number,
'components': self.object.components,
}
2024-11-06 16:21:48 +00:00
def remove_serial_number_from(self, components):
for component in components:
if 'serial_number' in component:
del component['SerialNumber']
return components
def get_device_data(self):
data = self.public_fields
if self.request.user.is_authenticated:
data.update(self.authenticated_fields)
return data
def get_json_response(self):
device_data = self.get_device_data()
return JsonResponse(device_data)
2024-10-08 05:26:48 +00:00
2024-07-18 15:21:22 +00:00
class AddAnnotationView(DashboardView, CreateView):
2024-07-30 11:37:08 +00:00
template_name = "new_annotation.html"
2024-07-18 15:21:22 +00:00
title = _("New annotation")
breadcrumb = "Device / New annotation"
2024-07-05 13:32:07 +00:00
success_url = reverse_lazy('dashboard:unassigned_devices')
2024-07-18 15:21:22 +00:00
model = Annotation
fields = ("key", "value")
2024-07-05 13:32:07 +00:00
2024-07-18 15:21:22 +00:00
def form_valid(self, form):
2024-09-18 16:01:46 +00:00
form.instance.owner = self.request.user.institution
form.instance.user = self.request.user
2024-07-30 11:37:08 +00:00
form.instance.uuid = self.annotation.uuid
2024-07-18 15:21:22 +00:00
form.instance.type = Annotation.Type.USER
response = super().form_valid(form)
return response
2024-07-08 10:59:32 +00:00
def get_form_kwargs(self):
pk = self.kwargs.get('pk')
2024-09-18 16:01:46 +00:00
institution = self.request.user.institution
2024-07-30 11:37:08 +00:00
self.annotation = Annotation.objects.filter(
2024-10-10 09:44:23 +00:00
owner=institution,
value=pk,
type=Annotation.Type.SYSTEM
2024-07-30 11:37:08 +00:00
).first()
2024-10-22 05:35:47 +00:00
2024-07-30 11:37:08 +00:00
if not self.annotation:
2024-10-10 09:44:23 +00:00
raise Http404
2024-07-18 15:21:22 +00:00
self.success_url = reverse_lazy('device:details', args=[pk])
2024-07-08 10:59:32 +00:00
kwargs = super().get_form_kwargs()
2024-07-05 13:32:07 +00:00
return kwargs
2024-07-18 15:21:22 +00:00
2024-07-30 11:37:08 +00:00
class AddDocumentView(DashboardView, CreateView):
template_name = "new_annotation.html"
title = _("New Document")
breadcrumb = "Device / New document"
success_url = reverse_lazy('dashboard:unassigned_devices')
model = Annotation
fields = ("key", "value")
def form_valid(self, form):
2024-09-18 16:01:46 +00:00
form.instance.owner = self.request.user.institution
form.instance.user = self.request.user
2024-07-30 11:37:08 +00:00
form.instance.uuid = self.annotation.uuid
form.instance.type = Annotation.Type.DOCUMENT
response = super().form_valid(form)
return response
2024-06-12 07:32:49 +00:00
2024-07-30 11:37:08 +00:00
def get_form_kwargs(self):
pk = self.kwargs.get('pk')
2024-09-18 16:01:46 +00:00
institution = self.request.user.institution
2024-07-30 11:37:08 +00:00
self.annotation = Annotation.objects.filter(
2024-10-10 09:44:23 +00:00
owner=institution,
value=pk,
type=Annotation.Type.SYSTEM
2024-07-30 11:37:08 +00:00
).first()
2024-10-10 09:44:23 +00:00
2024-07-30 11:37:08 +00:00
if not self.annotation:
2024-10-10 09:44:23 +00:00
raise Http404
2024-07-30 11:37:08 +00:00
self.success_url = reverse_lazy('device:details', args=[pk])
kwargs = super().get_form_kwargs()
return kwargs