Coverage for operatingsystem/views.py: 98%
60 statements
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-24 19:06 +0000
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-24 19:06 +0000
1from django.contrib.auth.mixins import LoginRequiredMixin
3from sm.views import SafeDeleteMixin, GenericCSVExportView
4from sm.mixins import MultiTenantMixin
5from typing import Any
7from .models import Model
8from .forms import Form, FormDisabled
9from . import app_label
11from django.views.generic import ListView as GenericListView
12from django.views.generic.edit import UpdateView as GenericUpdateView
13from django.views.generic.edit import CreateView as GenericCreateView
14from django.views.generic.edit import DeleteView as GenericDeleteView
15from django.contrib.messages.views import SuccessMessageMixin
17from django.utils.translation import gettext as _
19from django.urls import reverse_lazy
21from vendor.models import Model as VendorModel
24class ListView(LoginRequiredMixin, MultiTenantMixin, GenericListView):
25 template_name = "%s/list.html" % app_label
26 # Grouped list: rows are Vendors (with their operating systems prefetched),
27 # so the queryset model is the Vendor model. Permission checks stay
28 # anchored to this app via ``permission_model``.
29 model = VendorModel
30 permission_model = Model
31 paginate_by = 20
32 paginate_orphans = paginate_by / 4
33 ordering = "vendor"
35 def get_queryset(self) -> Any:
36 # Filtering by group is handled by MultiTenantMixin
37 # (via super().get_queryset())
38 # But we need the vendor grouping logic
39 qs = VendorModel.objects.filter(
40 is_software=True, group__in=self.request.user.groups.all()
41 )
42 if self.request.user.is_superuser:
43 qs = VendorModel.objects.filter(is_software=True)
45 if "srvmanager-show_empty" in self.request.COOKIES:
46 if self.request.COOKIES["srvmanager-show_empty"] == "false":
47 return qs.exclude(operatingsystem=None).order_by("name")
48 return qs.order_by("name")
51class DetailView(LoginRequiredMixin, MultiTenantMixin, GenericUpdateView):
52 template_name = "%s/detail.html" % app_label
53 model = Model
54 form_class = FormDisabled
57class UpdateView(
58 SuccessMessageMixin,
59 LoginRequiredMixin,
60 MultiTenantMixin,
61 GenericUpdateView,
62):
63 success_message = "%(version)s " + _("was updated successfully")
64 template_name = "%s/edit.html" % app_label
65 model = Model
66 form_class = Form
67 success_url = reverse_lazy("%s:index" % app_label)
70class CreateView(
71 SuccessMessageMixin,
72 LoginRequiredMixin,
73 MultiTenantMixin,
74 GenericCreateView,
75):
76 success_message = "%(version)s " + _("was created successfully")
78 template_name = "%s/edit.html" % app_label
79 form_class = Form
80 model = Model
81 success_url = reverse_lazy("%s:index" % app_label)
83 def get_initial(self) -> Any:
84 initial = super().get_initial()
85 if "vendor" in self.kwargs:
86 initial["vendor"] = VendorModel.objects.filter(
87 pk=self.kwargs["vendor"]
88 ).first()
89 return initial
92class DeleteView(
93 SafeDeleteMixin,
94 LoginRequiredMixin,
95 MultiTenantMixin,
96 GenericDeleteView,
97):
98 success_message = "%(version)s " + _("was deleted successfully")
99 template_name = "delete.html"
100 model = Model
101 success_url = reverse_lazy("%s:index" % app_label)
104class CSVExportView(GenericCSVExportView):
105 model = Model
106 filename = "operatingsystem.csv"
107 export_fields = [
108 ("version", "version"),
109 ("vendor", "vendor__name"),
110 ]