Loading djadhere/templates/base.html +5 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,11 @@ <span class="fas fa-coins"></span> Transparence </a> </li> <li class="nav-item{% block statustab %}{% endblock %}"> <a class="nav-link" href="{% url 'status' %}"> <span class="fas fa-bullhorn"></span> Status </a> </li> </ul> <ul class="navbar-nav"> {% if request.user.is_staff %} Loading services/templates/services/status.html 0 → 100644 +23 −0 Original line number Diff line number Diff line {% extends 'base.html' %} {% load humanize %} {% block statustab %} active{% endblock %} {% block content %} <div class="list-group"> {% for route, last_time_up, allocs in status %} <div class="list-group-item"> <div class="d-flex w-100 justify-content-between"> <h5 class="mb-1"><span class="badge badge-primary badge-pill">{{ allocs|length }} IPs</span> <b>{{ route }}</b></h5> <small>{{ last_time_up|naturaltime }}</small> </div> <ul> {% for alloc in allocs %} <li>{{ alloc.resource }} — {{ alloc.service.adhesion }} – {{ alloc.service }}</li> {% endfor %} </ul> </div> {% endfor %} </div> {% endblock %} services/urls.py +1 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ from . import views urlpatterns = [ path('status/', views.Status.as_view(), name='status'), path('services/<int:pk>/', views.ServiceDetail.as_view(), name='service-detail'), path('api/fastpinger/', views.fastpinger, name='fastpinger'), re_path(r'^api/routes/(?:(?P<route>[\w-]+)/)?$', views.routes, name='routes'), # TODO: path_re => path Loading services/views.py +30 −1 Original line number Diff line number Diff line from django.views.generic import DetailView from django.views.generic import DetailView, TemplateView from django.contrib.auth.mixins import LoginRequiredMixin from django.views.decorators.http import require_GET, require_POST from django.http import HttpResponseForbidden, HttpResponse Loading @@ -7,12 +7,41 @@ from django.views.decorators.csrf import csrf_exempt from django.shortcuts import get_object_or_404 from django.db import models from django.db.models.functions import Concat from django.utils import timezone from itertools import groupby from datetime import timedelta, datetime from djadhere.utils import get_active_filter from djadhere.decorators import api_key_required from .models import Service, Route, IPResource, ServiceAllocation from .utils.fastpinger import fastpinger_update from .utils.architecture import export_switch, export_ip from services.models import IPResource, IPResourceState, ServiceAllocation class Status(LoginRequiredMixin, TemplateView): template_name = 'services/status.html' def get_status(self): begin = timezone.make_aware(datetime(2019, 3, 1)) down = IPResource.objects.filter(last_state__state=IPResourceState.STATE_DOWN, last_state__date__gte=begin) allocations = ServiceAllocation.objects.filter(get_active_filter())\ .filter(resource__ip__in=down.values('ip')) events = [] threshold = getattr(settings, 'STATUS_THRESHOLD', 2) allocations = sorted(allocations, reverse=True, key=lambda a: (a.resource.last_state.date, a.route.pk)) for (last_time_up, route), allocs in groupby(allocations, key=lambda a: (a.resource.last_state.date, a.route.pk)): allocs = list(allocs) route = allocs[0].route if len(allocs) >= threshold: events.append((route, last_time_up, allocs)) return events def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['status'] = self.get_status() return context class ServiceDetail(LoginRequiredMixin, DetailView): Loading Loading
djadhere/templates/base.html +5 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,11 @@ <span class="fas fa-coins"></span> Transparence </a> </li> <li class="nav-item{% block statustab %}{% endblock %}"> <a class="nav-link" href="{% url 'status' %}"> <span class="fas fa-bullhorn"></span> Status </a> </li> </ul> <ul class="navbar-nav"> {% if request.user.is_staff %} Loading
services/templates/services/status.html 0 → 100644 +23 −0 Original line number Diff line number Diff line {% extends 'base.html' %} {% load humanize %} {% block statustab %} active{% endblock %} {% block content %} <div class="list-group"> {% for route, last_time_up, allocs in status %} <div class="list-group-item"> <div class="d-flex w-100 justify-content-between"> <h5 class="mb-1"><span class="badge badge-primary badge-pill">{{ allocs|length }} IPs</span> <b>{{ route }}</b></h5> <small>{{ last_time_up|naturaltime }}</small> </div> <ul> {% for alloc in allocs %} <li>{{ alloc.resource }} — {{ alloc.service.adhesion }} – {{ alloc.service }}</li> {% endfor %} </ul> </div> {% endfor %} </div> {% endblock %}
services/urls.py +1 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ from . import views urlpatterns = [ path('status/', views.Status.as_view(), name='status'), path('services/<int:pk>/', views.ServiceDetail.as_view(), name='service-detail'), path('api/fastpinger/', views.fastpinger, name='fastpinger'), re_path(r'^api/routes/(?:(?P<route>[\w-]+)/)?$', views.routes, name='routes'), # TODO: path_re => path Loading
services/views.py +30 −1 Original line number Diff line number Diff line from django.views.generic import DetailView from django.views.generic import DetailView, TemplateView from django.contrib.auth.mixins import LoginRequiredMixin from django.views.decorators.http import require_GET, require_POST from django.http import HttpResponseForbidden, HttpResponse Loading @@ -7,12 +7,41 @@ from django.views.decorators.csrf import csrf_exempt from django.shortcuts import get_object_or_404 from django.db import models from django.db.models.functions import Concat from django.utils import timezone from itertools import groupby from datetime import timedelta, datetime from djadhere.utils import get_active_filter from djadhere.decorators import api_key_required from .models import Service, Route, IPResource, ServiceAllocation from .utils.fastpinger import fastpinger_update from .utils.architecture import export_switch, export_ip from services.models import IPResource, IPResourceState, ServiceAllocation class Status(LoginRequiredMixin, TemplateView): template_name = 'services/status.html' def get_status(self): begin = timezone.make_aware(datetime(2019, 3, 1)) down = IPResource.objects.filter(last_state__state=IPResourceState.STATE_DOWN, last_state__date__gte=begin) allocations = ServiceAllocation.objects.filter(get_active_filter())\ .filter(resource__ip__in=down.values('ip')) events = [] threshold = getattr(settings, 'STATUS_THRESHOLD', 2) allocations = sorted(allocations, reverse=True, key=lambda a: (a.resource.last_state.date, a.route.pk)) for (last_time_up, route), allocs in groupby(allocations, key=lambda a: (a.resource.last_state.date, a.route.pk)): allocs = list(allocs) route = allocs[0].route if len(allocs) >= threshold: events.append((route, last_time_up, allocs)) return events def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['status'] = self.get_status() return context class ServiceDetail(LoginRequiredMixin, DetailView): Loading