mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-06 01:46:27 +00:00
Merge branch 'optimisation_requetes' into 'dev'
Optimisation requetes See merge request federez/re2o!425
This commit is contained in:
commit
ebe3a9a623
3 changed files with 81 additions and 32 deletions
|
@ -93,6 +93,7 @@ class EditPortForm(FormRevMixin, ModelForm):
|
||||||
Interface.objects.all().select_related('domain__extension')
|
Interface.objects.all().select_related('domain__extension')
|
||||||
)
|
)
|
||||||
self.fields['related'].queryset = Port.objects.all().prefetch_related('switch__machine_ptr__interface_set__domain__extension')
|
self.fields['related'].queryset = Port.objects.all().prefetch_related('switch__machine_ptr__interface_set__domain__extension')
|
||||||
|
self.fields['room'].queryset = Room.objects.all().select_related('building__dormitory')
|
||||||
|
|
||||||
|
|
||||||
class AddPortForm(FormRevMixin, ModelForm):
|
class AddPortForm(FormRevMixin, ModelForm):
|
||||||
|
|
|
@ -42,6 +42,7 @@ import itertools
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models.signals import post_save, post_delete
|
from django.db.models.signals import post_save, post_delete
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
|
from django.core.cache import cache
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
|
@ -586,6 +587,14 @@ class Dormitory(AclMixin, RevMixin, models.Model):
|
||||||
"""Returns all ap of the dorms"""
|
"""Returns all ap of the dorms"""
|
||||||
return AccessPoint.all_ap_in(self.building_set.all())
|
return AccessPoint.all_ap_in(self.building_set.all())
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_multiple_dorms(cls):
|
||||||
|
multiple_dorms = cache.get('multiple_dorms')
|
||||||
|
if multiple_dorms:
|
||||||
|
return multiple_dorms
|
||||||
|
else:
|
||||||
|
return cache.get_or_set('multiple_dorms', cls.objects.count() > 1)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
@ -611,16 +620,19 @@ class Building(AclMixin, RevMixin, models.Model):
|
||||||
"""Returns all ap of the building"""
|
"""Returns all ap of the building"""
|
||||||
return AccessPoint.all_ap_in(self)
|
return AccessPoint.all_ap_in(self)
|
||||||
|
|
||||||
@cached_property
|
def get_name(self):
|
||||||
def cached_name(self):
|
if Dormitory.is_multiple_dorms():
|
||||||
return self.__str__()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
if Dormitory.objects.count() > 1:
|
|
||||||
return self.dormitory.name + " : " + self.name
|
return self.dormitory.name + " : " + self.name
|
||||||
else:
|
else:
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def cached_name(self):
|
||||||
|
return self.get_name()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.cached_name
|
||||||
|
|
||||||
|
|
||||||
class Port(AclMixin, RevMixin, models.Model):
|
class Port(AclMixin, RevMixin, models.Model):
|
||||||
""" Definition d'un port. Relié à un switch(foreign_key),
|
""" Definition d'un port. Relié à un switch(foreign_key),
|
||||||
|
@ -799,7 +811,7 @@ class Room(AclMixin, RevMixin, models.Model):
|
||||||
unique_together = ('name', 'building')
|
unique_together = ('name', 'building')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.building.cached_name + self.name
|
return self.building.cached_name + ' ' + self.name
|
||||||
|
|
||||||
|
|
||||||
class PortProfile(AclMixin, RevMixin, models.Model):
|
class PortProfile(AclMixin, RevMixin, models.Model):
|
||||||
|
|
|
@ -129,7 +129,9 @@ def index(request):
|
||||||
.select_related('ipv4__ip_type__extension')
|
.select_related('ipv4__ip_type__extension')
|
||||||
.select_related('domain__extension'))
|
.select_related('domain__extension'))
|
||||||
))
|
))
|
||||||
.select_related('stack'))
|
.select_related('stack')
|
||||||
|
.select_related('switchbay__building__dormitory')
|
||||||
|
.select_related('model__constructor'))
|
||||||
switch_list = SortTable.sort(
|
switch_list = SortTable.sort(
|
||||||
switch_list,
|
switch_list,
|
||||||
request.GET.get('col'),
|
request.GET.get('col'),
|
||||||
|
@ -163,8 +165,10 @@ def index(request):
|
||||||
@can_view_all(PortProfile)
|
@can_view_all(PortProfile)
|
||||||
def index_port_profile(request):
|
def index_port_profile(request):
|
||||||
pagination_number = GeneralOption.get_cached_value('pagination_number')
|
pagination_number = GeneralOption.get_cached_value('pagination_number')
|
||||||
port_profile_list = PortProfile.objects.all().select_related(
|
port_profile_list = PortProfile.objects.all()\
|
||||||
'vlan_untagged')
|
.select_related('vlan_untagged')\
|
||||||
|
.select_related('on_dormitory')\
|
||||||
|
.prefetch_related('vlan_tagged')
|
||||||
port_profile_list = re2o_paginator(
|
port_profile_list = re2o_paginator(
|
||||||
request, port_profile_list, pagination_number)
|
request, port_profile_list, pagination_number)
|
||||||
vlan_list = Vlan.objects.all().order_by('vlan_id')
|
vlan_list = Vlan.objects.all().order_by('vlan_id')
|
||||||
|
@ -182,16 +186,18 @@ def index_port(request, switch, switchid):
|
||||||
""" Affichage de l'ensemble des ports reliés à un switch particulier"""
|
""" Affichage de l'ensemble des ports reliés à un switch particulier"""
|
||||||
port_list = (Port.objects
|
port_list = (Port.objects
|
||||||
.filter(switch=switch)
|
.filter(switch=switch)
|
||||||
.select_related('room')
|
.select_related('room__building__dormitory')
|
||||||
.select_related('machine_interface__domain__extension')
|
.select_related('machine_interface__domain__extension')
|
||||||
.select_related('machine_interface__machine__user')
|
.select_related('machine_interface__machine__user')
|
||||||
.select_related('related__switch')
|
.select_related('machine_interface__machine__accesspoint')
|
||||||
|
.select_related('related__switch__switchbay__building__dormitory')
|
||||||
.prefetch_related(Prefetch(
|
.prefetch_related(Prefetch(
|
||||||
'related__switch__interface_set',
|
'related__switch__interface_set',
|
||||||
queryset=(Interface.objects
|
queryset=(Interface.objects
|
||||||
.select_related('domain__extension'))
|
.select_related('domain__extension'))
|
||||||
))
|
))
|
||||||
.select_related('switch'))
|
.select_related('switch__switchbay__building__dormitory')
|
||||||
|
.select_related('switch__model__constructor'))
|
||||||
port_list = SortTable.sort(
|
port_list = SortTable.sort(
|
||||||
port_list,
|
port_list,
|
||||||
request.GET.get('col'),
|
request.GET.get('col'),
|
||||||
|
@ -213,7 +219,7 @@ def index_port(request, switch, switchid):
|
||||||
@can_view_all(Room)
|
@can_view_all(Room)
|
||||||
def index_room(request):
|
def index_room(request):
|
||||||
""" Affichage de l'ensemble des chambres"""
|
""" Affichage de l'ensemble des chambres"""
|
||||||
room_list = Room.objects
|
room_list = Room.objects.select_related('building__dormitory')
|
||||||
room_list = SortTable.sort(
|
room_list = SortTable.sort(
|
||||||
room_list,
|
room_list,
|
||||||
request.GET.get('col'),
|
request.GET.get('col'),
|
||||||
|
@ -263,9 +269,9 @@ def index_physical_grouping(request):
|
||||||
.prefetch_related(
|
.prefetch_related(
|
||||||
'switch_set__interface_set__domain__extension'
|
'switch_set__interface_set__domain__extension'
|
||||||
))
|
))
|
||||||
building_list = Building.objects.all()
|
building_list = Building.objects.all().select_related('dormitory')
|
||||||
dormitory_list = Dormitory.objects.all()
|
dormitory_list = Dormitory.objects.all().prefetch_related('building_set')
|
||||||
switch_bay_list = SwitchBay.objects.select_related('building')
|
switch_bay_list = SwitchBay.objects.select_related('building__dormitory').prefetch_related('switch_set__interface_set__domain')
|
||||||
stack_list = SortTable.sort(
|
stack_list = SortTable.sort(
|
||||||
stack_list,
|
stack_list,
|
||||||
request.GET.get('col'),
|
request.GET.get('col'),
|
||||||
|
@ -306,7 +312,7 @@ def index_physical_grouping(request):
|
||||||
@can_view_all(ModelSwitch, ConstructorSwitch)
|
@can_view_all(ModelSwitch, ConstructorSwitch)
|
||||||
def index_model_switch(request):
|
def index_model_switch(request):
|
||||||
""" Affichage de l'ensemble des modèles de switches"""
|
""" Affichage de l'ensemble des modèles de switches"""
|
||||||
model_switch_list = ModelSwitch.objects.select_related('constructor')
|
model_switch_list = ModelSwitch.objects.select_related('constructor').prefetch_related('switch_set__interface_set__domain')
|
||||||
constructor_switch_list = ConstructorSwitch.objects
|
constructor_switch_list = ConstructorSwitch.objects
|
||||||
model_switch_list = SortTable.sort(
|
model_switch_list = SortTable.sort(
|
||||||
model_switch_list,
|
model_switch_list,
|
||||||
|
@ -335,7 +341,8 @@ def index_model_switch(request):
|
||||||
def index_module(request):
|
def index_module(request):
|
||||||
"""Display all modules of switchs"""
|
"""Display all modules of switchs"""
|
||||||
module_list = ModuleSwitch.objects.all()
|
module_list = ModuleSwitch.objects.all()
|
||||||
modular_switchs = Switch.objects.filter(model__is_modular=True)
|
modular_switchs = Switch.objects.filter(model__is_modular=True)\
|
||||||
|
.select_related('model').prefetch_related('moduleonswitch_set__module')
|
||||||
pagination_number = GeneralOption.get_cached_value('pagination_number')
|
pagination_number = GeneralOption.get_cached_value('pagination_number')
|
||||||
module_list = re2o_paginator(request, module_list, pagination_number)
|
module_list = re2o_paginator(request, module_list, pagination_number)
|
||||||
return render(
|
return render(
|
||||||
|
@ -1265,7 +1272,14 @@ def make_machine_graph():
|
||||||
'head_server': "#1c3777"
|
'head_server': "#1c3777"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
missing = list(Switch.objects.all())
|
missing = list(Switch.objects.prefetch_related(Prefetch(
|
||||||
|
'interface_set',
|
||||||
|
queryset=(
|
||||||
|
Interface.objects
|
||||||
|
.select_related('ipv4__ip_type__extension')
|
||||||
|
.select_related('domain__extension')
|
||||||
|
)
|
||||||
|
)))
|
||||||
detected = []
|
detected = []
|
||||||
for building in Building.objects.all(): # Visit all buildings
|
for building in Building.objects.all(): # Visit all buildings
|
||||||
|
|
||||||
|
@ -1279,9 +1293,16 @@ def make_machine_graph():
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# Visit all switchs in this building
|
# Visit all switchs in this building
|
||||||
for switch in Switch.objects.filter(switchbay__building=building):
|
for switch in Switch.objects.filter(switchbay__building=building).prefetch_related(
|
||||||
|
Prefetch(
|
||||||
|
'interface_set',
|
||||||
|
queryset=(
|
||||||
|
Interface.objects
|
||||||
|
.select_related('ipv4__ip_type__extension')
|
||||||
|
.select_related('domain__extension')
|
||||||
|
))).select_related('switchbay__building').select_related('switchbay__building__dormitory').select_related('model__constructor'):
|
||||||
dico['subs'][-1]['switchs'].append({
|
dico['subs'][-1]['switchs'].append({
|
||||||
'name': switch.main_interface().domain.name,
|
'name': switch.get_name,
|
||||||
'nombre': switch.number,
|
'nombre': switch.number,
|
||||||
'model': switch.model,
|
'model': switch.model,
|
||||||
'id': switch.id,
|
'id': switch.id,
|
||||||
|
@ -1289,27 +1310,42 @@ def make_machine_graph():
|
||||||
'ports': []
|
'ports': []
|
||||||
})
|
})
|
||||||
# visit all ports of this switch and add the switchs linked to it
|
# visit all ports of this switch and add the switchs linked to it
|
||||||
for port in switch.ports.filter(related__isnull=False):
|
for port in switch.ports.filter(related__isnull=False).select_related('related__switch'):
|
||||||
dico['subs'][-1]['switchs'][-1]['ports'].append({
|
dico['subs'][-1]['switchs'][-1]['ports'].append({
|
||||||
'numero': port.port,
|
'numero': port.port,
|
||||||
'related': port.related.switch.main_interface().domain.name
|
'related': port.related.switch.get_name,
|
||||||
})
|
})
|
||||||
|
|
||||||
for ap in AccessPoint.all_ap_in(building):
|
for ap in AccessPoint.all_ap_in(building).prefetch_related(Prefetch(
|
||||||
|
'interface_set',
|
||||||
|
queryset=(
|
||||||
|
Interface.objects
|
||||||
|
.select_related('ipv4__ip_type__extension')
|
||||||
|
.select_related('domain__extension')
|
||||||
|
))
|
||||||
|
):
|
||||||
|
switch = ap.switch().first()
|
||||||
dico['subs'][-1]['bornes'].append({
|
dico['subs'][-1]['bornes'].append({
|
||||||
'name': ap.short_name,
|
'name': ap.short_name,
|
||||||
'switch': ap.switch()[0].main_interface().domain.name,
|
'switch': switch.get_name,
|
||||||
'port': ap.switch()[0].ports.filter(
|
'port': switch.ports.filter(
|
||||||
machine_interface__machine=ap
|
machine_interface__machine=ap
|
||||||
)[0].port
|
).first().port
|
||||||
})
|
})
|
||||||
for server in Server.all_server_in(building):
|
for server in Server.all_server_in(building).prefetch_related(Prefetch(
|
||||||
|
'interface_set',
|
||||||
|
queryset=(
|
||||||
|
Interface.objects
|
||||||
|
.select_related('ipv4__ip_type__extension')
|
||||||
|
.select_related('domain__extension')
|
||||||
|
))
|
||||||
|
):
|
||||||
dico['subs'][-1]['machines'].append({
|
dico['subs'][-1]['machines'].append({
|
||||||
'name': server.short_name,
|
'name': server.short_name,
|
||||||
'switch': server.switch()[0].main_interface().domain.name,
|
'switch': server.switch().first().get_name,
|
||||||
'port': Port.objects.filter(
|
'port': Port.objects.filter(
|
||||||
machine_interface__machine=server
|
machine_interface__machine=server
|
||||||
)[0].port
|
).first().port
|
||||||
})
|
})
|
||||||
|
|
||||||
# While the list of forgotten ones is not empty
|
# While the list of forgotten ones is not empty
|
||||||
|
@ -1330,7 +1366,7 @@ def make_machine_graph():
|
||||||
switchbay__isnull=True).exclude(ports__related__isnull=False):
|
switchbay__isnull=True).exclude(ports__related__isnull=False):
|
||||||
dico['alone'].append({
|
dico['alone'].append({
|
||||||
'id': switch.id,
|
'id': switch.id,
|
||||||
'name': switch.main_interface().domain.name
|
'name': switch.get_name,
|
||||||
})
|
})
|
||||||
|
|
||||||
# generate the dot file
|
# generate the dot file
|
||||||
|
|
Loading…
Reference in a new issue