architecture.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from django.db.models.functions import Concat
  2. from django.db import models
  3. from services.models import IPResource, IPPrefix, Service, ServiceType, ServiceAllocation, Switch
  4. from djadhere.utils import get_active_filter
  5. from textwrap import indent
  6. def export_switch():
  7. output = []
  8. for switch in Switch.objects.prefetch_related(
  9. 'ports', 'ports__service', 'ports__service__service_type', 'ports__service__adhesion',
  10. 'ports__service__adhesion__user', 'ports__service__adhesion__corporation').all():
  11. sw_output = "=== Switch %s ===\n" % switch.name
  12. sw_output += indent(switch.notes, "# ") + "\n"
  13. ports_output = []
  14. for port in switch.ports.all():
  15. line = "Port %d" % port.port
  16. if port.service:
  17. line += ' - (%s %s) %s' % (port.service.adhesion, port.service.adhesion.adherent, port.service)
  18. if port.notes:
  19. line += ' - %s' % port.notes
  20. ports_output += [line]
  21. sw_output += "\n".join(ports_output)
  22. output += [sw_output]
  23. return "\n\n".join(output)
  24. def export_ip():
  25. output = []
  26. for prefix in IPPrefix.objects.filter(ipresource__category=IPResource.CATEGORY_PUBLIC).order_by('prefix').distinct():
  27. prefix_output = ["=== %s ===" % prefix]
  28. active_ips = prefix.ipresource_set.filter(in_use=True)
  29. if not active_ips.exists():
  30. prefix_output += ["empty"]
  31. output += ["\n".join(prefix_output)]
  32. continue
  33. elif active_ips.count() < 20:
  34. ip_set = active_ips
  35. else:
  36. ip_set = prefix.ipresource_set
  37. ip_set = ip_set.annotate(
  38. allocation=models.Subquery(
  39. ServiceAllocation.objects.filter(
  40. models.Q(resource=models.OuterRef('pk')) & get_active_filter(),
  41. ).values('pk')[:1],
  42. ),
  43. service=models.Subquery(
  44. Service.objects.filter(
  45. models.Q(allocation__resource=models.OuterRef('pk')) & get_active_filter('allocation'),
  46. ).annotate(
  47. adherent=models.Case(
  48. models.When(adhesion__user__isnull=False, then=Concat('adhesion__user__first_name', models.Value(' '), 'adhesion__user__last_name')),
  49. models.When(adhesion__corporation__isnull=False, then='adhesion__corporation__social_reason'),
  50. ),
  51. fullname=Concat(
  52. models.Value('ADT'),
  53. 'adhesion_id',
  54. models.Value(' '),
  55. 'adherent',
  56. models.Value(' #'),
  57. 'pk',
  58. models.Value(' '),
  59. 'service_type__name',
  60. models.Value(' '),
  61. 'label',
  62. output_field=models.CharField(),
  63. ),
  64. ).values('fullname')[:1],
  65. output_field=models.CharField(),
  66. ),
  67. status=models.Case(
  68. models.When(reserved=True, then=models.Value('réservé')),
  69. models.When(allocation__isnull=True, then=models.Value('disponible')),
  70. default='service',
  71. output_field=models.CharField(),
  72. ),
  73. )
  74. for ip in ip_set.all():
  75. line = str(ip)
  76. line += ' - ' + ip.status
  77. prefix_output += [line]
  78. output += ["\n".join(prefix_output)]
  79. return "\n\n".join(output)