diff --git a/topologie/migrations/0072_auto_20190720_2318.py b/topologie/migrations/0072_auto_20190720_2318.py new file mode 100644 index 00000000..3c403bfa --- /dev/null +++ b/topologie/migrations/0072_auto_20190720_2318.py @@ -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')]), + ), + ] diff --git a/topologie/models.py b/topologie/models.py index dee8abb3..a379e005 100644 --- a/topologie/models.py +++ b/topologie/models.py @@ -650,7 +650,7 @@ class Port(AclMixin, RevMixin, models.Model): :returns: the profile of self (port)""" def profile_or_nothing(profile): port_profile = PortProfile.objects.filter( - profil_default=profile).first() + profil_default=profile).filter(switch__switchbay__building__dormitory).first() if port_profile: return port_profile else: @@ -791,9 +791,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 +878,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 +901,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 diff --git a/topologie/templates/topologie/aff_port_profile.html b/topologie/templates/topologie/aff_port_profile.html index b335904e..4ed8a7b4 100644 --- a/topologie/templates/topologie/aff_port_profile.html +++ b/topologie/templates/topologie/aff_port_profile.html @@ -35,7 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% trans "Name" %} - {% trans "Default for" %} + {% trans "Default for and place" %} {% trans "VLANs" %} {% trans "RADIUS settings" %} {% trans "Speed limit" %} @@ -47,7 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% for port_profile in port_profile_list %} {{ port_profile.name }} - {{ port_profile.profil_default }} + {{ port_profile.profil_default }} {% if port_profile.profil_default%} - {% if port_profile.on_dormitory %} on {{ port_profile.on_dormitory }} {% else %} Everywhere {% endif %}{% endif %} {% if port_profile.vlan_untagged %} {% trans "Untagged: " %}{{ port_profile.vlan_untagged }}