views.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from django.views.generic import DetailView
  2. from django.contrib.auth.mixins import LoginRequiredMixin
  3. from django.views.decorators.http import require_GET, require_POST
  4. from django.http import HttpResponseForbidden, HttpResponse
  5. from django.conf import settings
  6. from django.views.decorators.csrf import csrf_exempt
  7. from django.shortcuts import get_object_or_404
  8. from django.db import models
  9. from django.db.models.functions import Concat
  10. from djadhere.utils import get_active_filter
  11. from .models import Service, Route, IPResource, ServiceAllocation
  12. from .utils.fastpinger import fastpinger_update
  13. class ServiceDetail(LoginRequiredMixin, DetailView):
  14. def get_queryset(self):
  15. adhesions = self.request.user.profile.adhesions.values_list('pk')
  16. return Service.objects.filter(adhesion__pk__in=adhesions).order_by('service_type')
  17. @csrf_exempt
  18. @require_POST
  19. def fastpinger(request):
  20. if request.POST.get('key', None) != settings.FASTPINGER_KEY:
  21. return HttpResponseForbidden('Invalid key.')
  22. if 'fastpinger' not in request.FILES:
  23. return HttpResponse(status=400) # Bad Request
  24. stats = fastpinger_update(request.FILES['fastpinger'])
  25. return HttpResponse(stats + '\n')
  26. @require_GET
  27. def routes(request, route=None):
  28. resources = IPResource.objects.filter(category=0) # IP publics
  29. if route:
  30. route = get_object_or_404(Route, name=route)
  31. resources = resources.filter(pk__in=route.get_ip())
  32. resources = resources.annotate(
  33. route=models.Subquery(
  34. ServiceAllocation.objects.filter(
  35. models.Q(resource=models.OuterRef('pk')) & get_active_filter(),
  36. ).values('route__name')[:1],
  37. )
  38. )
  39. resources = resources.annotate(
  40. route=models.Case(
  41. models.When(reserved=True, then=models.Value('reserved')),
  42. models.When(route__isnull=True, then=models.Value('unused')),
  43. default='route',
  44. output_field=models.CharField()
  45. )
  46. )
  47. resources = resources.annotate(
  48. route=Concat('ip', models.Value(' '), 'route', output_field=models.CharField()),
  49. )
  50. resources = resources.annotate(
  51. order=models.Case(
  52. models.When(ip__startswith='91.224', then=1),
  53. models.When(ip__startswith='89.234', then=2),
  54. models.When(ip__startswith='185.119', then=3),
  55. )
  56. )
  57. resources = resources.order_by('order', 'ip')
  58. content = '\n'.join(resources.values_list('route', flat=True)) + '\n'
  59. return HttpResponse(content, content_type='text/plain')