Browse Source

api: ip_ttnn.txt

Élie Bouttier 7 years ago
parent
commit
f738a5acbf
2 changed files with 43 additions and 2 deletions
  1. 1 0
      services/urls.py
  2. 42 2
      services/views.py

+ 1 - 0
services/urls.py

@@ -6,4 +6,5 @@ from . import views
 urlpatterns = [
     url(r'^services/(?P<pk>[0-9]+)/$', views.ServiceDetail.as_view(), name='service-detail'),
     url(r'^api/fastpinger/$', views.fastpinger, name='fastpinger'),
+    url(r'^api/routes/(?:(?P<route>[\w-]+)/)?$', views.routes, name='routes'),
 ]

+ 42 - 2
services/views.py

@@ -1,11 +1,15 @@
 from django.views.generic import DetailView
 from django.contrib.auth.mixins import LoginRequiredMixin
-from django.views.decorators.http import require_POST
+from django.views.decorators.http import require_GET, require_POST
 from django.http import HttpResponseForbidden, HttpResponse
 from django.conf import settings
 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 .models import Service
+from djadhere.utils import get_active_filter
+from .models import Service, Route, IPResource, ServiceAllocation
 from .utils.fastpinger import fastpinger_update
 
 
@@ -24,3 +28,39 @@ def fastpinger(request):
         return HttpResponse(status=400)  # Bad Request
     stats = fastpinger_update(request.FILES['fastpinger'])
     return HttpResponse(stats + '\n')
+
+
+@require_GET
+def routes(request, route=None):
+    resources = IPResource.objects.filter(category=0) # IP publics
+    if route:
+        route = get_object_or_404(Route, name=route)
+        resources = resources.filter(pk__in=route.get_ip())
+    resources = resources.annotate(
+            route=models.Subquery(
+                ServiceAllocation.objects.filter(
+                    models.Q(resource=models.OuterRef('pk')) & get_active_filter(),
+                ).values('route__name')[:1],
+            )
+    )
+    resources = resources.annotate(
+            route=models.Case(
+                models.When(reserved=True, then=models.Value('reserved')),
+                models.When(route__isnull=True, then=models.Value('unused')),
+                default='route',
+                output_field=models.CharField()
+            )
+    )
+    resources = resources.annotate(
+            route=Concat('ip', models.Value(' '), 'route', output_field=models.CharField()),
+    )
+    resources = resources.annotate(
+            order=models.Case(
+                models.When(ip__startswith='91.224', then=1),
+                models.When(ip__startswith='89.234', then=2),
+                models.When(ip__startswith='185.119', then=3),
+            )
+    )
+    resources = resources.order_by('order', 'ip')
+    content = '\n'.join(resources.values_list('route', flat=True)) + '\n'
+    return HttpResponse(content, content_type='text/plain')