architecture.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. )
  44. ip_set = ip_set.annotate(
  45. service=models.Subquery(
  46. Service.objects.filter(
  47. models.Q(allocation__resource=models.OuterRef('pk')) & get_active_filter('allocation'),
  48. ).annotate(
  49. adherent=models.Case(
  50. models.When(adhesion__user__isnull=False, then=Concat('adhesion__user__first_name', models.Value(' '), 'adhesion__user__last_name')),
  51. models.When(adhesion__corporation__isnull=False, then='adhesion__corporation__social_reason'),
  52. ),
  53. ).annotate(
  54. fullname=Concat(
  55. models.Value('ADT'),
  56. 'adhesion_id',
  57. models.Value(' '),
  58. 'adherent',
  59. models.Value(' #'),
  60. 'pk',
  61. models.Value(' '),
  62. 'service_type__name',
  63. models.Value(' '),
  64. 'label',
  65. output_field=models.CharField(),
  66. ),
  67. ).values('fullname')[:1],
  68. output_field=models.CharField(),
  69. ),
  70. )
  71. ip_set = ip_set.annotate(
  72. status=models.Case(
  73. models.When(reserved=True, then=models.Value('réservé')),
  74. models.When(allocation__isnull=True, then=models.Value('disponible')),
  75. default='service',
  76. output_field=models.CharField(),
  77. ),
  78. )
  79. for ip in ip_set.all():
  80. line = str(ip)
  81. line += ' - ' + ip.status
  82. prefix_output += [line]
  83. output += ["\n".join(prefix_output)]
  84. return "\n\n".join(output)