Coverage for clusterpackage/views.py: 94%
93 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
2from django.contrib import messages
3from django.http import HttpResponseRedirect
4from sm.views import SafeDeleteMixin, GenericCSVExportView, GenericBulkDeleteView
5from sm.mixins import MultiTenantMixin, BulkActionMixin
8from .models import Model
9from .forms import Form, FormDisabled
10from . import app_label
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
18from django.utils.translation import gettext as _
20try:
21 from django.urls import reverse_lazy
22except Exception: # pragma: no cover
23 from django.urls import reverse_lazy # pragma: no cover
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"
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)
41class DetailView(LoginRequiredMixin, GenericUpdateView):
42 template_name = "%s/detail.html" % app_label
43 model = Model
44 form_class = FormDisabled
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)
54class UpdateView(SuccessMessageMixin, LoginRequiredMixin, GenericUpdateView):
55 success_message = "%(name)s " + _("was updated successfully")
57 template_name = "%s/edit.html" % app_label
58 model = Model
60 def get_form_kwargs(self):
61 kwargs = super().get_form_kwargs()
62 kwargs["user"] = self.request.user
63 return kwargs
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__)
70 return HttpResponseRedirect(self.get_success_url())
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)
79 form_class = Form
80 success_url = reverse_lazy("%s:index" % app_label)
83class CreateView(SuccessMessageMixin, LoginRequiredMixin, GenericCreateView):
84 success_message = "%(name)s " + _("was created successfully")
86 template_name = "%s/edit.html" % app_label
87 form_class = Form
88 model = Model
89 success_url = reverse_lazy("%s:index" % app_label)
91 def get_form_kwargs(self):
92 kwargs = super().get_form_kwargs()
93 kwargs["user"] = self.request.user
94 return kwargs
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__)
105 return HttpResponseRedirect(self.get_success_url())
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)
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)
122class BulkDeleteView(GenericBulkDeleteView):
123 model = Model
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 ]