WIP: Lot groups search/filtering and lot groups panel ui changes #61
|
@ -4,8 +4,6 @@ from dashboard import views
|
||||||
app_name = 'dashboard'
|
app_name = 'dashboard'
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("", views.UnassignedDevicesView.as_view(), name="unassigned"),
|
|
||||||
path("all", views.AllDevicesView.as_view(), name="all_device"),
|
path("all", views.AllDevicesView.as_view(), name="all_device"),
|
||||||
path("<int:pk>/", views.LotDashboardView.as_view(), name="lot"),
|
|
||||||
path("search", views.SearchView.as_view(), name="search"),
|
path("search", views.SearchView.as_view(), name="search"),
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,16 +12,6 @@ from device.models import Device
|
||||||
from lot.models import Lot
|
from lot.models import Lot
|
||||||
|
|
||||||
|
|
||||||
class UnassignedDevicesView(InventaryMixin):
|
|
||||||
template_name = "unassigned_devices.html"
|
|
||||||
section = "Unassigned"
|
|
||||||
title = _("Unassigned Devices")
|
|
||||||
breadcrumb = "Devices / Unassigned Devices"
|
|
||||||
|
|
||||||
def get_devices(self, user, offset, limit):
|
|
||||||
return Device.get_unassigned(self.request.user.institution, offset, limit)
|
|
||||||
|
|
||||||
|
|
||||||
class AllDevicesView(InventaryMixin):
|
class AllDevicesView(InventaryMixin):
|
||||||
template_name = "unassigned_devices.html"
|
template_name = "unassigned_devices.html"
|
||||||
section = "All"
|
section = "All"
|
||||||
|
@ -32,40 +22,6 @@ class AllDevicesView(InventaryMixin):
|
||||||
return Device.get_all(self.request.user.institution, offset, limit)
|
return Device.get_all(self.request.user.institution, offset, limit)
|
||||||
|
|
||||||
|
|
||||||
class LotDashboardView(InventaryMixin, DetailsMixin):
|
|
||||||
template_name = "unassigned_devices.html"
|
|
||||||
section = "dashboard_lot"
|
|
||||||
title = _("Lot Devices")
|
|
||||||
breadcrumb = "Lot / Devices"
|
|
||||||
model = Lot
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
|
||||||
context = super().get_context_data(**kwargs)
|
|
||||||
lot = context.get('object')
|
|
||||||
context.update({
|
|
||||||
'lot': lot,
|
|
||||||
})
|
|
||||||
return context
|
|
||||||
|
|
||||||
def get_devices(self, user, offset, limit):
|
|
||||||
chids = self.object.devicelot_set.all().values_list(
|
|
||||||
"device_id", flat=True
|
|
||||||
).distinct()
|
|
||||||
|
|
||||||
props = SystemProperty.objects.filter(
|
|
||||||
owner=self.request.user.institution,
|
|
||||||
value__in=chids
|
|
||||||
).order_by("-created")
|
|
||||||
|
|
||||||
chids_ordered = []
|
|
||||||
for x in props:
|
|
||||||
if x.value not in chids_ordered:
|
|
||||||
chids_ordered.append(x.value)
|
|
||||||
|
|
||||||
chids_page = chids_ordered[offset:offset+limit]
|
|
||||||
return [Device(id=x) for x in chids_page], len(chids_ordered)
|
|
||||||
|
|
||||||
|
|
||||||
class SearchView(InventaryMixin):
|
class SearchView(InventaryMixin):
|
||||||
template_name = "unassigned_devices.html"
|
template_name = "unassigned_devices.html"
|
||||||
section = "Search"
|
section = "Search"
|
||||||
|
|
|
@ -4,6 +4,8 @@ from lot import views
|
||||||
app_name = 'lot'
|
app_name = 'lot'
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
path("unasigned", views.UnassignedDevicesView.as_view(), name="unassigned"),
|
||||||
|
path("<int:pk>/", views.LotView.as_view(), name="lot"),
|
||||||
path("add/", views.NewLotView.as_view(), name="add"),
|
path("add/", views.NewLotView.as_view(), name="add"),
|
||||||
path("delete/<int:pk>/", views.DeleteLotView.as_view(), name="delete"),
|
path("delete/<int:pk>/", views.DeleteLotView.as_view(), name="delete"),
|
||||||
path("edit/<int:pk>/", views.EditLotView.as_view(), name="edit"),
|
path("edit/<int:pk>/", views.EditLotView.as_view(), name="edit"),
|
||||||
|
|
59
lot/views.py
59
lot/views.py
|
@ -2,6 +2,7 @@ from django.db import IntegrityError
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
from django.shortcuts import get_object_or_404, redirect, Http404
|
from django.shortcuts import get_object_or_404, redirect, Http404
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
|
from dashboard.mixins import InventaryMixin, DetailsMixin
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django.views.generic.base import TemplateView
|
from django.views.generic.base import TemplateView
|
||||||
|
@ -14,13 +15,14 @@ from django.views.generic.edit import (
|
||||||
)
|
)
|
||||||
import django_tables2 as tables
|
import django_tables2 as tables
|
||||||
from dashboard.mixins import DashboardView
|
from dashboard.mixins import DashboardView
|
||||||
|
from evidence.models import SystemProperty
|
||||||
|
from device.models import Device
|
||||||
from lot.models import Lot, LotTag, LotProperty
|
from lot.models import Lot, LotTag, LotProperty
|
||||||
from lot.forms import LotsForm
|
from lot.forms import LotsForm
|
||||||
|
|
||||||
|
|
||||||
class LotSuccessUrlMixin():
|
class LotSuccessUrlMixin():
|
||||||
|
success_url = reverse_lazy('lot:unassigned') #default_url
|
||||||
success_url = reverse_lazy('dashboard:unassigned') #default_url
|
|
||||||
|
|
||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
lot_group_id = LotTag.objects.only('id').get(
|
lot_group_id = LotTag.objects.only('id').get(
|
||||||
|
@ -143,7 +145,7 @@ class AddToLotView(DashboardView, FormView):
|
||||||
template_name = "list_lots.html"
|
template_name = "list_lots.html"
|
||||||
title = _("Add to lots")
|
title = _("Add to lots")
|
||||||
breadcrumb = "lot / add to lots"
|
breadcrumb = "lot / add to lots"
|
||||||
success_url = reverse_lazy('dashboard:unassigned')
|
success_url = reverse_lazy('lot:unassigned')
|
||||||
form_class = LotsForm
|
form_class = LotsForm
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
|
@ -181,7 +183,7 @@ class DelToLotView(AddToLotView):
|
||||||
|
|
||||||
|
|
||||||
class LotTable(tables.Table):
|
class LotTable(tables.Table):
|
||||||
name = tables.Column(linkify=("dashboard:lot", {"pk": tables.A("id")}), verbose_name=_("Lot Name"), attrs={"td": {"class": "fw-bold"}})
|
name = tables.Column(linkify=("lot:lot", {"pk": tables.A("id")}), verbose_name=_("Lot Name"), attrs={"td": {"class": "fw-bold"}})
|
||||||
description = tables.Column(verbose_name=_("Description"), default=_("No description"),attrs={"td": {"class": "text-muted"}} )
|
description = tables.Column(verbose_name=_("Description"), default=_("No description"),attrs={"td": {"class": "text-muted"}} )
|
||||||
closed = tables.Column(verbose_name=_("Status"))
|
closed = tables.Column(verbose_name=_("Status"))
|
||||||
created = tables.DateColumn(format="Y-m-d", verbose_name=_("Created On"))
|
created = tables.DateColumn(format="Y-m-d", verbose_name=_("Created On"))
|
||||||
|
@ -209,9 +211,9 @@ class LotTable(tables.Table):
|
||||||
|
|
||||||
class LotsTagsView(DashboardView, tables.SingleTableView):
|
class LotsTagsView(DashboardView, tables.SingleTableView):
|
||||||
template_name = "lots.html"
|
template_name = "lots.html"
|
||||||
title = _("lots")
|
title = _("Lot group")
|
||||||
breadcrumb = _("lots") + " /"
|
breadcrumb = _("lots") + " /"
|
||||||
success_url = reverse_lazy('dashboard:unassigned')
|
success_url = reverse_lazy('lot:unassigned')
|
||||||
model = Lot
|
model = Lot
|
||||||
table_class = LotTable
|
table_class = LotTable
|
||||||
|
|
||||||
|
@ -280,7 +282,7 @@ class AddLotPropertyView(DashboardView, CreateView):
|
||||||
template_name = "new_property.html"
|
template_name = "new_property.html"
|
||||||
title = _("New Lot Property")
|
title = _("New Lot Property")
|
||||||
breadcrumb = "Device / New property"
|
breadcrumb = "Device / New property"
|
||||||
success_url = reverse_lazy('dashboard:unassigned_devices')
|
success_url = reverse_lazy('lot:unassigned_devices')
|
||||||
model = LotProperty
|
model = LotProperty
|
||||||
fields = ("key", "value")
|
fields = ("key", "value")
|
||||||
|
|
||||||
|
@ -365,3 +367,46 @@ class DeleteLotPropertyView(DashboardView, DeleteView):
|
||||||
|
|
||||||
# Redirect back to the original URL
|
# Redirect back to the original URL
|
||||||
return redirect(self.success_url)
|
return redirect(self.success_url)
|
||||||
|
|
||||||
|
|
||||||
|
class UnassignedDevicesView(InventaryMixin):
|
||||||
|
template_name = "unassigned_devices.html"
|
||||||
|
section = "Unassigned"
|
||||||
|
title = _("Unassigned Devices")
|
||||||
|
breadcrumb = "Devices / Unassigned Devices"
|
||||||
|
|
||||||
|
def get_devices(self, user, offset, limit):
|
||||||
|
return Device.get_unassigned(self.request.user.institution, offset, limit)
|
||||||
|
|
||||||
|
class LotView(InventaryMixin, DetailsMixin):
|
||||||
|
template_name = "unassigned_devices.html"
|
||||||
|
section = "dashboard_lot"
|
||||||
|
breadcrumb = "Lot / Devices"
|
||||||
|
model = Lot
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super().get_context_data(**kwargs)
|
||||||
|
lot = context.get('object')
|
||||||
|
context.update({
|
||||||
|
'lot': lot,
|
||||||
|
'title': _("Lot {}".format(lot.name))
|
||||||
|
})
|
||||||
|
return context
|
||||||
|
|
||||||
|
def get_devices(self, user, offset, limit):
|
||||||
|
chids = self.object.devicelot_set.all().values_list(
|
||||||
|
"device_id", flat=True
|
||||||
|
).distinct()
|
||||||
|
|
||||||
|
props = SystemProperty.objects.filter(
|
||||||
|
owner=self.request.user.institution,
|
||||||
|
value__in=chids
|
||||||
|
).order_by("-created")
|
||||||
|
|
||||||
|
chids_ordered = []
|
||||||
|
for x in props:
|
||||||
|
if x.value not in chids_ordered:
|
||||||
|
chids_ordered.append(x.value)
|
||||||
|
|
||||||
|
chids_page = chids_ordered[offset:offset+limit]
|
||||||
|
return [Device(id=x) for x in chids_page], len(chids_ordered)
|
||||||
|
|
Loading…
Reference in a new issue