Coverage for operatingsystem/views.py: 98%

60 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-10-24 19:06 +0000

1from django.contrib.auth.mixins import LoginRequiredMixin 

2 

3from sm.views import SafeDeleteMixin, GenericCSVExportView 

4from sm.mixins import MultiTenantMixin 

5from typing import Any 

6 

7from .models import Model 

8from .forms import Form, FormDisabled 

9from . import app_label 

10 

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 

16 

17from django.utils.translation import gettext as _ 

18 

19from django.urls import reverse_lazy 

20 

21from vendor.models import Model as VendorModel 

22 

23 

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" 

34 

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) 

44 

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") 

49 

50 

51class DetailView(LoginRequiredMixin, MultiTenantMixin, GenericUpdateView): 

52 template_name = "%s/detail.html" % app_label 

53 model = Model 

54 form_class = FormDisabled 

55 

56 

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) 

68 

69 

70class CreateView( 

71 SuccessMessageMixin, 

72 LoginRequiredMixin, 

73 MultiTenantMixin, 

74 GenericCreateView, 

75): 

76 success_message = "%(version)s " + _("was created successfully") 

77 

78 template_name = "%s/edit.html" % app_label 

79 form_class = Form 

80 model = Model 

81 success_url = reverse_lazy("%s:index" % app_label) 

82 

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 

90 

91 

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) 

102 

103 

104class CSVExportView(GenericCSVExportView): 

105 model = Model 

106 filename = "operatingsystem.csv" 

107 export_fields = [ 

108 ("version", "version"), 

109 ("vendor", "vendor__name"), 

110 ]