mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-27 15:12:25 +00:00
Merge branch 'dormitory_port_profile' into 'dev'
Dormitory port profile See merge request federez/re2o!424
This commit is contained in:
commit
2e4e139227
4 changed files with 117 additions and 22 deletions
34
topologie/migrations/0072_auto_20190720_2318.py
Normal file
34
topologie/migrations/0072_auto_20190720_2318.py
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.7 on 2019-07-20 21:18
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('topologie', '0071_auto_20190218_1936'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='room',
|
||||||
|
options={'ordering': ['building__name'], 'permissions': (('view_room', 'Can view a room object'),), 'verbose_name': 'room', 'verbose_name_plural': 'rooms'},
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='portprofile',
|
||||||
|
name='on_dormitory',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dormitory_ofprofil', to='topologie.Dormitory', verbose_name='Profil on dormitory'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='portprofile',
|
||||||
|
name='profil_default',
|
||||||
|
field=models.CharField(blank=True, choices=[('room', 'Room'), ('access_point', 'Access point'), ('uplink', 'Uplink'), ('asso_machine', 'Organisation machine'), ('nothing', 'Nothing')], max_length=32, null=True, verbose_name='Default profile'),
|
||||||
|
),
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name='portprofile',
|
||||||
|
unique_together=set([('on_dormitory', 'profil_default')]),
|
||||||
|
),
|
||||||
|
]
|
|
@ -379,6 +379,58 @@ class Switch(AclMixin, Machine):
|
||||||
modules.append((module_of_self.slot, module_of_self.module.reference))
|
modules.append((module_of_self.slot, module_of_self.module.reference))
|
||||||
return modules
|
return modules
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def get_dormitory(self):
|
||||||
|
"""Returns the dormitory of that switch"""
|
||||||
|
if self.switchbay:
|
||||||
|
return self.switchbay.building.dormitory
|
||||||
|
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):
|
def __str__(self):
|
||||||
return str(self.get_name)
|
return str(self.get_name)
|
||||||
|
|
||||||
|
@ -647,33 +699,26 @@ class Port(AclMixin, RevMixin, models.Model):
|
||||||
@cached_property
|
@cached_property
|
||||||
def get_port_profile(self):
|
def get_port_profile(self):
|
||||||
"""Return the config profil for this port
|
"""Return the config profil for this port
|
||||||
:returns: the profile of self (port)"""
|
:returns: the profile of self (port)
|
||||||
def profile_or_nothing(profile):
|
|
||||||
port_profile = PortProfile.objects.filter(
|
If is defined a custom profile, returns it
|
||||||
profil_default=profile).first()
|
elIf a default profile is defined for its dormitory, returns it
|
||||||
if port_profile:
|
Else, returns the global default profil
|
||||||
return port_profile
|
If not exists, create a nothing 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:
|
if self.custom_profile:
|
||||||
return self.custom_profile
|
return self.custom_profile
|
||||||
elif self.related:
|
elif self.related:
|
||||||
return profile_or_nothing('uplink')
|
return self.switch.default_uplink_profile
|
||||||
elif self.machine_interface:
|
elif self.machine_interface:
|
||||||
if hasattr(self.machine_interface.machine, 'accesspoint'):
|
if hasattr(self.machine_interface.machine, 'accesspoint'):
|
||||||
return profile_or_nothing('access_point')
|
return self.switch.default_access_point_profile
|
||||||
else:
|
else:
|
||||||
return profile_or_nothing('asso_machine')
|
return self.switch.default_asso_machine_profile
|
||||||
elif self.room:
|
elif self.room:
|
||||||
return profile_or_nothing('room')
|
return self.switch.default_room_profile
|
||||||
else:
|
else:
|
||||||
return profile_or_nothing('nothing')
|
return Switch.nothing_profile
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_instance(cls, portid, *_args, **kwargs):
|
def get_instance(cls, portid, *_args, **kwargs):
|
||||||
|
@ -791,9 +836,16 @@ class PortProfile(AclMixin, RevMixin, models.Model):
|
||||||
choices=PROFIL_DEFAULT,
|
choices=PROFIL_DEFAULT,
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
unique=True,
|
|
||||||
verbose_name=_("Default profile")
|
verbose_name=_("Default profile")
|
||||||
)
|
)
|
||||||
|
on_dormitory = models.ForeignKey(
|
||||||
|
'topologie.Dormitory',
|
||||||
|
related_name='dormitory_ofprofil',
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
|
blank=True,
|
||||||
|
null=True,
|
||||||
|
verbose_name=_("Profil on dormitory")
|
||||||
|
)
|
||||||
vlan_untagged = models.ForeignKey(
|
vlan_untagged = models.ForeignKey(
|
||||||
'machines.Vlan',
|
'machines.Vlan',
|
||||||
related_name='vlan_untagged',
|
related_name='vlan_untagged',
|
||||||
|
@ -871,6 +923,7 @@ class PortProfile(AclMixin, RevMixin, models.Model):
|
||||||
)
|
)
|
||||||
verbose_name = _("port profile")
|
verbose_name = _("port profile")
|
||||||
verbose_name_plural = _("port profiles")
|
verbose_name_plural = _("port profiles")
|
||||||
|
unique_together = ['on_dormitory', 'profil_default']
|
||||||
|
|
||||||
security_parameters_fields = [
|
security_parameters_fields = [
|
||||||
'loop_protect',
|
'loop_protect',
|
||||||
|
@ -893,6 +946,14 @@ class PortProfile(AclMixin, RevMixin, models.Model):
|
||||||
def security_parameters_as_str(self):
|
def security_parameters_as_str(self):
|
||||||
return ','.join(self.security_parameters_enabled)
|
return ','.join(self.security_parameters_enabled)
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
""" Check that there is only one generic profil default"""
|
||||||
|
super(PortProfile, self).clean()
|
||||||
|
if self.profil_default and not self.on_dormitory and PortProfile.objects.exclude(id=self.id).filter(profil_default=self.profil_default).exclude(on_dormitory__isnull=False).exists():
|
||||||
|
raise ValidationError(
|
||||||
|
{'profil_default': _("A default profile for all dormitory of that type already exists.")}
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{% if not port.custom_profil %}
|
{% if not port.custom_profile %}
|
||||||
<u>{% trans "Default: " %}</u>
|
<u>{% trans "Default: " %}</u>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{ port.get_port_profile }}
|
{{ port.get_port_profile }}
|
||||||
|
|
|
@ -35,7 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "Name" %}</th>
|
<th>{% trans "Name" %}</th>
|
||||||
<th>{% trans "Default for" %}</th>
|
<th>{% trans "Default for and place" %}</th>
|
||||||
<th>{% trans "VLANs" %}</th>
|
<th>{% trans "VLANs" %}</th>
|
||||||
<th>{% trans "RADIUS settings" %}</th>
|
<th>{% trans "RADIUS settings" %}</th>
|
||||||
<th>{% trans "Speed limit" %}</th>
|
<th>{% trans "Speed limit" %}</th>
|
||||||
|
@ -47,7 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% for port_profile in port_profile_list %}
|
{% for port_profile in port_profile_list %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ port_profile.name }}</td>
|
<td>{{ port_profile.name }}</td>
|
||||||
<td>{{ port_profile.profil_default }}</td>
|
<td>{{ port_profile.profil_default }} {% if port_profile.profil_default%}<b> - {% if port_profile.on_dormitory %} on {{ port_profile.on_dormitory }} {% else %} Everywhere {% endif %}</b>{% endif %}</td>
|
||||||
<td>
|
<td>
|
||||||
{% if port_profile.vlan_untagged %}
|
{% if port_profile.vlan_untagged %}
|
||||||
<b>{% trans "Untagged: " %}</b>{{ port_profile.vlan_untagged }}
|
<b>{% trans "Untagged: " %}</b>{{ port_profile.vlan_untagged }}
|
||||||
|
|
Loading…
Reference in a new issue