# Copyright 2013 Hewlett-Packard Development Company, L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.contrib import messages from django.core.paginator import EmptyPage from django.core.paginator import Paginator from django.urls import reverse from django.urls import reverse_lazy from django.utils.translation import ugettext as _ # noqa from horizon import exceptions from horizon import forms from horizon import tables from horizon.utils import functions as utils from monitoring import api from monitoring.notifications import constants from monitoring.notifications import forms as notification_forms from monitoring.notifications import tables as notification_tables from openstack_dashboard import policy PREV_PAGE_LIMIT = 100 class IndexView(tables.DataTableView): table_class = notification_tables.NotificationsTable template_name = constants.TEMPLATE_PREFIX + 'index.html' def dispatch(self, *args, **kwargs): return super(IndexView, self).dispatch(*args, **kwargs) def get_data(self): page_offset = self.request.GET.get('page_offset') results = [] if page_offset is None: page_offset = 0 limit = utils.get_page_size(self.request) try: results = api.monitor.notification_list(self.request, page_offset, limit) paginator = Paginator(results, limit) results = paginator.page(1) except EmptyPage: results = paginator.page(paginator.num_pages) except Exception: messages.error(self.request, _("Could not retrieve notifications")) return results def get_context_data(self, **kwargs): if not policy.check((('monitoring', 'monitoring:monitoring'), ), self.request): raise exceptions.NotAuthorized() context = super(IndexView, self).get_context_data(**kwargs) contacts = [] results = [] num_results = 0 prev_page_stack = [] page_offset = self.request.GET.get('page_offset') if 'prev_page_stack' in self.request.session: prev_page_stack = self.request.session['prev_page_stack'] if page_offset is None: page_offset = 0 prev_page_stack = [] else: page_offset = int(page_offset) limit = utils.get_page_size(self.request) try: # To judge whether there is next page, get LIMIT + 1 results = api.monitor.notification_list(self.request, page_offset, limit + 1) num_results = len(results) paginator = Paginator(results, limit) contacts = paginator.page(1) except EmptyPage: contacts = paginator.page(paginator.num_pages) except Exception: messages.error(self.request, _("Could not retrieve notifications")) return context context["contacts"] = contacts if num_results < limit + 1: context["page_offset"] = None else: context["page_offset"] = page_offset + limit if page_offset in prev_page_stack: index = prev_page_stack.index(page_offset) prev_page_stack = prev_page_stack[0:index] prev_page_offset = prev_page_stack[-1] if prev_page_stack else None if prev_page_offset is not None: context["prev_page_offset"] = prev_page_offset if len(prev_page_stack) > PREV_PAGE_LIMIT: del prev_page_stack[0] prev_page_stack.append(page_offset) self.request.session['prev_page_stack'] = prev_page_stack return context class NotificationCreateView(forms.ModalFormView): form_class = notification_forms.CreateMethodForm template_name = constants.TEMPLATE_PREFIX + 'create.html' success_url = reverse_lazy(constants.URL_PREFIX + 'index') def get_context_data(self, **kwargs): if not policy.check((('monitoring', 'monitoring:monitoring'), ), self.request): raise exceptions.NotAuthorized() context = super(NotificationCreateView, self). \ get_context_data(**kwargs) context["cancel_url"] = self.get_success_url() action = constants.URL_PREFIX + 'notification_create' context["action_url"] = reverse(action) return context class NotificationEditView(forms.ModalFormView): form_class = notification_forms.EditMethodForm template_name = constants.TEMPLATE_PREFIX + 'edit.html' def dispatch(self, *args, **kwargs): return super(NotificationEditView, self).dispatch(*args, **kwargs) def get_object(self): id = self.kwargs['id'] try: if hasattr(self, "_object"): return self._object self._object = None self._object = api.monitor.notification_get(self.request, id) return self._object except Exception: redirect = reverse(constants.URL_PREFIX + 'index') exceptions.handle(self.request, _('Unable to retrieve notification details.'), redirect=redirect) return None def get_initial(self): self.notification = self.get_object() return self.notification def get_context_data(self, **kwargs): if not policy.check((('monitoring', 'monitoring:monitoring'), ), self.request): raise exceptions.NotAuthorized() context = super(NotificationEditView, self).get_context_data(**kwargs) id = self.kwargs['id'] context["cancel_url"] = self.get_success_url() context["action_url"] = reverse(constants.URL_PREFIX + 'notification_edit', args=(id,)) return context def get_success_url(self): return reverse_lazy(constants.URL_PREFIX + 'index',)