devicehub-django/dashboard/mixins.py

115 lines
3.6 KiB
Python
Raw Normal View History

2024-07-05 13:32:07 +00:00
from django.urls import resolve
from django.shortcuts import get_object_or_404, redirect, Http404
2024-07-05 13:32:07 +00:00
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import PermissionDenied
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.base import TemplateView
2024-07-09 15:31:24 +00:00
from device.models import Device
2024-07-26 15:59:34 +00:00
from evidence.models import Annotation
2024-07-18 15:21:22 +00:00
from lot.models import LotTag
2024-07-05 13:32:07 +00:00
class Http403(PermissionDenied):
status_code = 403
default_detail = _('Permission denied. User is not authenticated')
default_code = 'forbidden'
def __init__(self, details=None, code=None):
if details is not None:
self.detail = details or self.default_details
if code is not None:
self.code = code or self.default_code
class DashboardView(LoginRequiredMixin):
login_url = "/login/"
template_name = "dashboard.html"
breadcrumb = ""
title = ""
subtitle = ""
section = ""
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update({
'title': self.title,
'subtitle': self.subtitle,
'breadcrumb': self.breadcrumb,
# 'icon': self.icon,
'section': self.section,
'path': resolve(self.request.path).url_name,
'user': self.request.user,
2024-09-18 16:01:46 +00:00
'lot_tags': LotTag.objects.filter(owner=self.request.user.institution)
2024-07-05 13:32:07 +00:00
})
return context
2024-07-09 15:31:24 +00:00
def get_session_devices(self):
dev_ids = self.request.session.pop("devices", [])
2024-07-19 15:40:01 +00:00
self._devices = []
for x in Annotation.objects.filter(value__in=dev_ids).filter(
owner=self.request.user.institution
).distinct():
2024-07-19 15:40:01 +00:00
self._devices.append(Device(id=x.value))
2024-07-09 15:31:24 +00:00
return self._devices
2024-07-05 13:32:07 +00:00
class DetailsMixin(DashboardView, TemplateView):
def get(self, request, *args, **kwargs):
self.pk = kwargs['pk']
2024-09-18 16:01:46 +00:00
self.object = get_object_or_404(self.model, pk=self.pk, owner=self.request.user.institution)
2024-07-05 13:32:07 +00:00
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update({
'object': self.object,
})
return context
2024-07-09 11:34:30 +00:00
2024-07-15 14:23:14 +00:00
2024-07-09 11:34:30 +00:00
class InventaryMixin(DashboardView, TemplateView):
def post(self, request, *args, **kwargs):
2024-07-09 15:31:24 +00:00
dev_ids = dict(self.request.POST).get("devices", [])
self.request.session["devices"] = dev_ids
2024-07-09 11:34:30 +00:00
url = self.request.POST.get("url")
if url:
try:
resource = resolve(url)
2024-07-09 15:31:24 +00:00
if resource and dev_ids:
2024-07-09 11:34:30 +00:00
return redirect(url)
except Exception:
pass
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
2024-10-02 10:51:40 +00:00
limit = self.request.GET.get("limit")
page = self.request.GET.get("page")
try:
limit = int(limit)
page = int(page)
if page < 1:
page = 1
if limit < 1:
limit = 10
except:
limit = 10
page = 1
offset = (page - 1) * limit
devices, count = self.get_devices(self.request.user, offset, limit)
total_pages = (count + limit - 1) // limit
context.update({
'devices': devices,
'count': count,
"limit": limit,
"offset": offset,
"page": page,
"total_pages": total_pages,
})
return context