diff --git a/cabot/cabotapp/views.py b/cabot/cabotapp/views.py index a357247..1b8c161 100644 --- a/cabot/cabotapp/views.py +++ b/cabot/cabotapp/views.py @@ -15,6 +15,7 @@ from django.contrib.auth import get_user_model from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.core.exceptions import ValidationError +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.core.urlresolvers import reverse, reverse_lazy from django.core.validators import URLValidator from django.db import transaction @@ -54,6 +55,7 @@ def subscriptions(request): 'services': services, 'users': users, 'duty_officers': get_duty_officers(), + 'custom_check_types': get_custom_check_plugins(), }) @@ -94,7 +96,35 @@ def duplicate_jenkins_check(request, pk): return HttpResponseRedirect(reverse('update-jenkins-check', kwargs={'pk': npk})) -class StatusCheckResultDetailView(LoginRequiredMixin, DetailView): +class BaseCommonView(object): + def render_to_response(self, context, *args, **kwargs): + if context is None: + context = {} + context['custom_check_types'] = get_custom_check_plugins() + return super(BaseCommonView, self).render_to_response(context, *args, **kwargs) + + +class CommonCreateView(BaseCommonView, CreateView): + pass + + +class CommonUpdateView(BaseCommonView, UpdateView): + pass + + +class CommonDeleteView(BaseCommonView, DeleteView): + pass + + +class CommonDetailView(BaseCommonView, DetailView): + pass + + +class CommonListView(BaseCommonView, ListView): + pass + + +class StatusCheckResultDetailView(LoginRequiredMixin, CommonDetailView): model = StatusCheckResult context_object_name = 'result' @@ -415,7 +445,7 @@ class StatusCheckReportForm(forms.Form): return checks -class CheckCreateView(LoginRequiredMixin, CreateView): +class CheckCreateView(LoginRequiredMixin, CommonCreateView): template_name = 'cabotapp/statuscheck_form.html' def form_valid(self, form): @@ -457,7 +487,7 @@ class CheckCreateView(LoginRequiredMixin, CreateView): return reverse('checks') -class CheckUpdateView(LoginRequiredMixin, UpdateView): +class CheckUpdateView(LoginRequiredMixin, CommonUpdateView): template_name = 'cabotapp/statuscheck_form.html' def get_success_url(self): @@ -512,26 +542,25 @@ class JenkinsCheckUpdateView(CheckUpdateView): return super(JenkinsCheckUpdateView, self).form_valid(form) -class StatusCheckListView(LoginRequiredMixin, ListView): +class StatusCheckListView(LoginRequiredMixin, CommonListView): model = StatusCheck def render_to_response(self, context, *args, **kwargs): context = super(StatusCheckListView, self).get_context_data(**kwargs) if context is None: context = {} - context['custom_check_types'] = get_custom_check_plugins() context['checks'] = StatusCheck.objects.all().order_by('name').prefetch_related('service_set', 'instance_set') return super(StatusCheckListView, self).render_to_response(context, *args, **kwargs) -class StatusCheckDeleteView(LoginRequiredMixin, DeleteView): +class StatusCheckDeleteView(LoginRequiredMixin, CommonDeleteView): model = StatusCheck success_url = reverse_lazy('checks') context_object_name = 'check' template_name = 'cabotapp/statuscheck_confirm_delete.html' -class StatusCheckDetailView(LoginRequiredMixin, DetailView): +class StatusCheckDetailView(LoginRequiredMixin, CommonDetailView): model = StatusCheck context_object_name = 'check' template_name = 'cabotapp/statuscheck_detail.html' @@ -539,9 +568,20 @@ class StatusCheckDetailView(LoginRequiredMixin, DetailView): def render_to_response(self, context, *args, **kwargs): if context is None: context = {} - context['custom_check_types'] = get_custom_check_plugins() - context['checkresults'] = self.object.statuscheckresult_set.order_by( - '-time_complete')[:100] + checkresult_list = self.object.statuscheckresult_set.order_by( + '-time_complete').all() + paginator = Paginator(checkresult_list, 25) + + page = self.request.GET.get('page') + try: + checkresults = paginator.page(page) + except PageNotAnInteger: + checkresults = paginator.page(1) + except EmptyPage: + checkresults = paginator.page(paginator.num_pages) + + context['checkresults'] = checkresults + return super(StatusCheckDetailView, self).render_to_response(context, *args, **kwargs) @@ -581,6 +621,7 @@ class UserProfileUpdateAlert(LoginRequiredMixin, View): return render(request, self.template.template.name, { 'form': form, 'alert_preferences': profile.user_data(), + 'custom_check_types': get_custom_check_plugins(), }) def post(self, request, pk, alerttype): @@ -634,7 +675,8 @@ class PluginSettingsView(LoginRequiredMixin, View): 'form': form, 'plugins': AlertPlugin.objects.all(), 'plugin_name': plugin_name, - 'alert_test_form': alert_test_form + 'alert_test_form': alert_test_form, + 'custom_check_types': get_custom_check_plugins() }) def post(self, request, plugin_name): @@ -798,7 +840,7 @@ class GeneralSettingsForm(forms.Form): enabled = forms.BooleanField(label='Enabled', required=False) -class InstanceListView(LoginRequiredMixin, ListView): +class InstanceListView(LoginRequiredMixin, CommonListView): model = Instance context_object_name = 'instances' @@ -806,7 +848,7 @@ class InstanceListView(LoginRequiredMixin, ListView): return Instance.objects.all().order_by('name').prefetch_related('status_checks') -class ServiceListView(LoginRequiredMixin, ListView): +class ServiceListView(LoginRequiredMixin, CommonListView): model = Service context_object_name = 'services' @@ -826,14 +868,13 @@ class ServicePublicListView(TemplateView): .order_by(Lower('name')).prefetch_related('status_checks') return context -class InstanceDetailView(LoginRequiredMixin, DetailView): +class InstanceDetailView(LoginRequiredMixin, CommonDetailView): model = Instance context_object_name = 'instance' def get_context_data(self, **kwargs): context = super(InstanceDetailView, self).get_context_data(**kwargs) date_from = date.today() - relativedelta(day=1) - context['custom_check_types'] = get_custom_check_plugins() context['report_form'] = StatusCheckReportForm(initial={ 'checks': self.object.status_checks.all(), 'service': self.object, @@ -843,14 +884,13 @@ class InstanceDetailView(LoginRequiredMixin, DetailView): return context -class ServiceDetailView(LoginRequiredMixin, DetailView): +class ServiceDetailView(LoginRequiredMixin, CommonDetailView): model = Service context_object_name = 'service' def get_context_data(self, **kwargs): context = super(ServiceDetailView, self).get_context_data(**kwargs) date_from = date.today() - relativedelta(day=1) - context['custom_check_types'] = get_custom_check_plugins() context['report_form'] = StatusCheckReportForm(initial={ 'alerts': self.object.alerts.all(), 'checks': self.object.status_checks.all(), @@ -861,7 +901,7 @@ class ServiceDetailView(LoginRequiredMixin, DetailView): return context -class InstanceCreateView(LoginRequiredMixin, CreateView): +class InstanceCreateView(LoginRequiredMixin, CommonCreateView): model = Instance form_class = InstanceForm @@ -916,7 +956,7 @@ def remove_acknowledgement(request, pk): return HttpResponseRedirect(reverse('service', kwargs={'pk': pk})) -class ServiceCreateView(LoginRequiredMixin, CreateView): +class ServiceCreateView(LoginRequiredMixin, CommonCreateView): model = Service form_class = ServiceForm @@ -927,7 +967,7 @@ class ServiceCreateView(LoginRequiredMixin, CreateView): return reverse('service', kwargs={'pk': self.object.id}) -class InstanceUpdateView(LoginRequiredMixin, UpdateView): +class InstanceUpdateView(LoginRequiredMixin, CommonUpdateView): model = Instance form_class = InstanceForm @@ -935,7 +975,7 @@ class InstanceUpdateView(LoginRequiredMixin, UpdateView): return reverse('instance', kwargs={'pk': self.object.id}) -class ServiceUpdateView(LoginRequiredMixin, UpdateView): +class ServiceUpdateView(LoginRequiredMixin, CommonUpdateView): model = Service form_class = ServiceForm @@ -943,21 +983,21 @@ class ServiceUpdateView(LoginRequiredMixin, UpdateView): return reverse('service', kwargs={'pk': self.object.id}) -class ServiceDeleteView(LoginRequiredMixin, DeleteView): +class ServiceDeleteView(LoginRequiredMixin, CommonDeleteView): model = Service success_url = reverse_lazy('services') context_object_name = 'service' template_name = 'cabotapp/service_confirm_delete.html' -class InstanceDeleteView(LoginRequiredMixin, DeleteView): +class InstanceDeleteView(LoginRequiredMixin, CommonDeleteView): model = Instance success_url = reverse_lazy('instances') context_object_name = 'instance' template_name = 'cabotapp/instance_confirm_delete.html' -class ShiftListView(LoginRequiredMixin, ListView): +class ShiftListView(LoginRequiredMixin, CommonListView): model = Shift context_object_name = 'shifts' diff --git a/cabot/templates/base.html b/cabot/templates/base.html index fc9b9f5..7d73751 100644 --- a/cabot/templates/base.html +++ b/cabot/templates/base.html @@ -37,7 +37,7 @@ {% for checktype in custom_check_types %}