8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-11-05 17:36:27 +00:00

Merge branch 'optimisation_requetes' into 'dev'

Optimisation requetes

See merge request federez/re2o!425
This commit is contained in:
grizzly 2019-08-07 16:00:17 +02:00
commit ebe3a9a623
3 changed files with 81 additions and 32 deletions

View file

@ -93,6 +93,7 @@ class EditPortForm(FormRevMixin, ModelForm):
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['room'].queryset = Room.objects.all().select_related('building__dormitory')
class AddPortForm(FormRevMixin, ModelForm):

View file

@ -42,6 +42,7 @@ import itertools
from django.db import models
from django.db.models.signals import post_save, post_delete
from django.utils.functional import cached_property
from django.core.cache import cache
from django.dispatch import receiver
from django.core.exceptions import ValidationError
from django.db import IntegrityError
@ -586,6 +587,14 @@ class Dormitory(AclMixin, RevMixin, models.Model):
"""Returns all ap of the dorms"""
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):
return self.name
@ -611,16 +620,19 @@ class Building(AclMixin, RevMixin, models.Model):
"""Returns all ap of the building"""
return AccessPoint.all_ap_in(self)
@cached_property
def cached_name(self):
return self.__str__()
def __str__(self):
if Dormitory.objects.count() > 1:
def get_name(self):
if Dormitory.is_multiple_dorms():
return self.dormitory.name + " : " + self.name
else:
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):
""" Definition d'un port. Relié à un switch(foreign_key),
@ -799,7 +811,7 @@ class Room(AclMixin, RevMixin, models.Model):
unique_together = ('name', 'building')
def __str__(self):
return self.building.cached_name + self.name
return self.building.cached_name + ' ' + self.name
class PortProfile(AclMixin, RevMixin, models.Model):

View file

@ -129,7 +129,9 @@ def index(request):
.select_related('ipv4__ip_type__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,
request.GET.get('col'),
@ -163,8 +165,10 @@ def index(request):
@can_view_all(PortProfile)
def index_port_profile(request):
pagination_number = GeneralOption.get_cached_value('pagination_number')
port_profile_list = PortProfile.objects.all().select_related(
'vlan_untagged')
port_profile_list = PortProfile.objects.all()\
.select_related('vlan_untagged')\
.select_related('on_dormitory')\
.prefetch_related('vlan_tagged')
port_profile_list = re2o_paginator(
request, port_profile_list, pagination_number)
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"""
port_list = (Port.objects
.filter(switch=switch)
.select_related('room')
.select_related('room__building__dormitory')
.select_related('machine_interface__domain__extension')
.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(
'related__switch__interface_set',
queryset=(Interface.objects
.select_related('domain__extension'))
))
.select_related('switch'))
.select_related('switch__switchbay__building__dormitory')
.select_related('switch__model__constructor'))
port_list = SortTable.sort(
port_list,
request.GET.get('col'),
@ -213,7 +219,7 @@ def index_port(request, switch, switchid):
@can_view_all(Room)
def index_room(request):
""" Affichage de l'ensemble des chambres"""
room_list = Room.objects
room_list = Room.objects.select_related('building__dormitory')
room_list = SortTable.sort(
room_list,
request.GET.get('col'),
@ -263,9 +269,9 @@ def index_physical_grouping(request):
.prefetch_related(
'switch_set__interface_set__domain__extension'
))
building_list = Building.objects.all()
dormitory_list = Dormitory.objects.all()
switch_bay_list = SwitchBay.objects.select_related('building')
building_list = Building.objects.all().select_related('dormitory')
dormitory_list = Dormitory.objects.all().prefetch_related('building_set')
switch_bay_list = SwitchBay.objects.select_related('building__dormitory').prefetch_related('switch_set__interface_set__domain')
stack_list = SortTable.sort(
stack_list,
request.GET.get('col'),
@ -306,7 +312,7 @@ def index_physical_grouping(request):
@can_view_all(ModelSwitch, ConstructorSwitch)
def index_model_switch(request):
""" 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
model_switch_list = SortTable.sort(
model_switch_list,
@ -335,7 +341,8 @@ def index_model_switch(request):
def index_module(request):
"""Display all modules of switchs"""
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')
module_list = re2o_paginator(request, module_list, pagination_number)
return render(
@ -1265,7 +1272,14 @@ def make_machine_graph():
'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 = []
for building in Building.objects.all(): # Visit all buildings
@ -1279,9 +1293,16 @@ def make_machine_graph():
}
)
# 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({
'name': switch.main_interface().domain.name,
'name': switch.get_name,
'nombre': switch.number,
'model': switch.model,
'id': switch.id,
@ -1289,27 +1310,42 @@ def make_machine_graph():
'ports': []
})
# 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({
'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({
'name': ap.short_name,
'switch': ap.switch()[0].main_interface().domain.name,
'port': ap.switch()[0].ports.filter(
'switch': switch.get_name,
'port': switch.ports.filter(
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({
'name': server.short_name,
'switch': server.switch()[0].main_interface().domain.name,
'switch': server.switch().first().get_name,
'port': Port.objects.filter(
machine_interface__machine=server
)[0].port
).first().port
})
# 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):
dico['alone'].append({
'id': switch.id,
'name': switch.main_interface().domain.name
'name': switch.get_name,
})
# generate the dot file