8
0
Fork 0
mirror of https://gitlab.federez.net/re2o/re2o synced 2024-07-04 05:04:06 +00:00

Merge branch 'dormitory_port_profile' into 'dev'

Dormitory port profile

See merge request federez/re2o!424
This commit is contained in:
klafyvel 2019-07-27 07:51:56 +02:00
commit 2e4e139227
4 changed files with 117 additions and 22 deletions

View 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')]),
),
]

View file

@ -379,6 +379,58 @@ class Switch(AclMixin, Machine):
modules.append((module_of_self.slot, module_of_self.module.reference))
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):
return str(self.get_name)
@ -647,33 +699,26 @@ class Port(AclMixin, RevMixin, models.Model):
@cached_property
def get_port_profile(self):
"""Return the config profil for this port
:returns: the profile of self (port)"""
def profile_or_nothing(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
:returns: the profile of self (port)
If is defined a custom profile, returns it
elIf a default profile is defined for its dormitory, returns it
Else, returns the global default profil
If not exists, create a 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):
@ -791,9 +836,16 @@ class PortProfile(AclMixin, RevMixin, models.Model):
choices=PROFIL_DEFAULT,
blank=True,
null=True,
unique=True,
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(
'machines.Vlan',
related_name='vlan_untagged',
@ -871,6 +923,7 @@ class PortProfile(AclMixin, RevMixin, models.Model):
)
verbose_name = _("port profile")
verbose_name_plural = _("port profiles")
unique_together = ['on_dormitory', 'profil_default']
security_parameters_fields = [
'loop_protect',
@ -893,6 +946,14 @@ class PortProfile(AclMixin, RevMixin, models.Model):
def security_parameters_as_str(self):
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):
return self.name

View file

@ -88,7 +88,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endif %}
</td>
<td>
{% if not port.custom_profil %}
{% if not port.custom_profile %}
<u>{% trans "Default: " %}</u>
{% endif %}
{{ port.get_port_profile }}

View file

@ -35,7 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<thead>
<tr>
<th>{% trans "Name" %}</th>
<th>{% trans "Default for" %}</th>
<th>{% trans "Default for and place" %}</th>
<th>{% trans "VLANs" %}</th>
<th>{% trans "RADIUS settings" %}</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 %}
<tr>
<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>
{% if port_profile.vlan_untagged %}
<b>{% trans "Untagged: " %}</b>{{ port_profile.vlan_untagged }}