diff --git a/topologie/models.py b/topologie/models.py index c01d5b53..2eaa3364 100644 --- a/topologie/models.py +++ b/topologie/models.py @@ -387,6 +387,50 @@ class Switch(AclMixin, Machine): else: return None + @classmethod + def nothing_profile(cls): + """Return default nothing port profile""" + nothing_profile, _created = PortProfile.objects.get_or_create( + profil_default='nothing', + name='nothing', + radius_type='NO' + ) + return nothing_profile + + def profile_type_or_nothing(self, profile_type): + """Return the profile for a profile_type of this switch + + If exists, returns the defined default profile for a profile type on the dormitory which + the switch belongs + + Otherwise, returns the nothing profile""" + profile_queryset = PortProfile.objects.filter(profil_default=profile_type) + if self.get_dormitory: + port_profile = profile_queryset.filter(on_dormitory=self.get_dormitory).first() or profile_queryset.first() + else: + port_profile = profile_queryset.first() + return port_profile or Switch.nothing_profile + + @cached_property + def default_uplink_profile(self): + """Default uplink profile for that switch -- in cache""" + return self.profile_type_or_nothing('uplink') + + @cached_property + def default_access_point_profile(self): + """Default ap profile for that switch -- in cache""" + return self.profile_type_or_nothing('access_point') + + @cached_property + def default_room_profile(self): + """Default room profile for that switch -- in cache""" + return self.profile_type_or_nothing('room') + + @cached_property + def default_asso_machine_profile(self): + """Default asso machine profile for that switch -- in cache""" + return self.profile_type_or_nothing('asso_machine') + def __str__(self): return str(self.get_name) @@ -661,35 +705,20 @@ class Port(AclMixin, RevMixin, models.Model): elIf a default profile is defined for its dormitory, returns it Else, returns the global default profil If not exists, create a nothing profile""" - def profile_or_nothing(profile): - if self.switch.get_dormitory: - port_profile = PortProfile.objects.filter( - profil_default=profile).filter(on_dormitory=self.switch.get_dormitory).first() - if not port_profile: - port_profile = PortProfile.objects.filter(profil_default=profile).first() - if port_profile: - return port_profile - else: - nothing_profile, _created = PortProfile.objects.get_or_create( - profil_default='nothing', - name='nothing', - radius_type='NO' - ) - return nothing_profile if self.custom_profile: return self.custom_profile elif self.related: - return profile_or_nothing('uplink') + return self.switch.default_uplink_profile elif self.machine_interface: if hasattr(self.machine_interface.machine, 'accesspoint'): - return profile_or_nothing('access_point') + return self.switch.default_access_point_profile else: - return profile_or_nothing('asso_machine') + return self.switch.default_asso_machine_profile elif self.room: - return profile_or_nothing('room') + return self.switch.default_room_profile else: - return profile_or_nothing('nothing') + return Switch.nothing_profile @classmethod def get_instance(cls, portid, *_args, **kwargs):