Coverage for clusterpackage/views.py: 94%

93 statements  

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

1from django.contrib.auth.mixins import LoginRequiredMixin 

2from django.contrib import messages 

3from django.http import HttpResponseRedirect 

4from sm.views import SafeDeleteMixin, GenericCSVExportView, GenericBulkDeleteView 

5from sm.mixins import MultiTenantMixin, BulkActionMixin 

6 

7 

8from .models import Model 

9from .forms import Form, FormDisabled 

10from . import app_label 

11 

12from django.views.generic import ListView as GenericListView 

13from django.views.generic.edit import UpdateView as GenericUpdateView 

14from django.views.generic.edit import CreateView as GenericCreateView 

15from django.views.generic.edit import DeleteView as GenericDeleteView 

16from django.contrib.messages.views import SuccessMessageMixin 

17 

18from django.utils.translation import gettext as _ 

19 

20try: 

21 from django.urls import reverse_lazy 

22except Exception: # pragma: no cover 

23 from django.urls import reverse_lazy # pragma: no cover 

24 

25 

26class ListView(LoginRequiredMixin, BulkActionMixin, GenericListView): 

27 template_name = "%s/list.html" % app_label 

28 model = Model 

29 paginate_by = 20 

30 paginate_orphans = paginate_by / 4 

31 ordering = "name" 

32 

33 def get_queryset(self): 

34 queryset = super().get_queryset() 

35 if self.request.user.is_superuser: 

36 return queryset.order_by(self.ordering) 

37 user_groups = self.request.user.groups.all() 

38 return queryset.filter(cluster__group__in=user_groups).order_by(self.ordering) 

39 

40 

41class DetailView(LoginRequiredMixin, GenericUpdateView): 

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

43 model = Model 

44 form_class = FormDisabled 

45 

46 def get_queryset(self): 

47 queryset = super().get_queryset() 

48 if self.request.user.is_superuser: 

49 return queryset 

50 user_groups = self.request.user.groups.all() 

51 return queryset.filter(cluster__group__in=user_groups) 

52 

53 

54class UpdateView(SuccessMessageMixin, LoginRequiredMixin, GenericUpdateView): 

55 success_message = "%(name)s " + _("was updated successfully") 

56 

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

58 model = Model 

59 

60 def get_form_kwargs(self): 

61 kwargs = super().get_form_kwargs() 

62 kwargs["user"] = self.request.user 

63 return kwargs 

64 

65 def form_valid(self, form): 

66 self.object = form.save(commit=False) 

67 self.object.save() 

68 messages.success(self.request, self.success_message % self.object.__dict__) 

69 

70 return HttpResponseRedirect(self.get_success_url()) 

71 

72 def get_queryset(self): 

73 queryset = super().get_queryset() 

74 if self.request.user.is_superuser: 

75 return queryset 

76 user_groups = self.request.user.groups.all() 

77 return queryset.filter(cluster__group__in=user_groups) 

78 

79 form_class = Form 

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

81 

82 

83class CreateView(SuccessMessageMixin, LoginRequiredMixin, GenericCreateView): 

84 success_message = "%(name)s " + _("was created successfully") 

85 

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

87 form_class = Form 

88 model = Model 

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

90 

91 def get_form_kwargs(self): 

92 kwargs = super().get_form_kwargs() 

93 kwargs["user"] = self.request.user 

94 return kwargs 

95 

96 def form_valid(self, form): 

97 self.object = form.save(commit=False) 

98 # Group is not a form field (editable=False); new packages inherit 

99 # their cluster's tenant group. 

100 if self.object.group is None: 

101 self.object.group = self.object.cluster.group 

102 self.object.save() 

103 messages.success(self.request, self.success_message % self.object.__dict__) 

104 

105 return HttpResponseRedirect(self.get_success_url()) 

106 

107 

108class DeleteView(SafeDeleteMixin, LoginRequiredMixin, GenericDeleteView): 

109 success_message = "%(name)s " + _("was deleted successfully") 

110 template_name = "delete.html" 

111 model = Model 

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

113 

114 def get_queryset(self): 

115 queryset = super().get_queryset() 

116 if self.request.user.is_superuser: 

117 return queryset 

118 user_groups = self.request.user.groups.all() 

119 return queryset.filter(cluster__group__in=user_groups) 

120 

121 

122class BulkDeleteView(GenericBulkDeleteView): 

123 model = Model 

124 

125 

126class CSVExportView(GenericCSVExportView): 

127 model = Model 

128 filename = "clusterpackage.csv" 

129 export_fields = [ 

130 ("name", "name"), 

131 ("cluster", "cluster__name"), 

132 ("status", "status__name"), 

133 ("package_type", "package_type__name"), 

134 ("host", "host"), 

135 ("description", "description"), 

136 ]