diff --git a/topologie/forms.py b/topologie/forms.py index 42572fe7..6e37bb0c 100644 --- a/topologie/forms.py +++ b/topologie/forms.py @@ -78,7 +78,7 @@ class EditPortForm(ModelForm): self.fields['machine_interface'].queryset = Interface.objects.all()\ .select_related('domain__extension') self.fields['related'].queryset = Port.objects.all()\ - .select_related('switch__switch_interface__domain__extension')\ + .select_related('switch__domain__extension')\ .order_by('switch', 'port') @@ -95,7 +95,7 @@ class AddPortForm(ModelForm): self.fields['machine_interface'].queryset = Interface.objects.all()\ .select_related('domain__extension') self.fields['related'].queryset = Port.objects.all()\ - .select_related('switch__switch_interface__domain__extension')\ + .select_related('switch__domain__extension')\ .order_by('switch', 'port') @@ -126,32 +126,19 @@ class EditBorneForm(EditInterfaceForm): fields = ['machine', 'type', 'ipv4', 'mac_address', 'details', 'location'] -class EditSwitchForm(ModelForm): +class EditSwitchForm(EditInterfaceForm): """Permet d'éditer un switch : nom et nombre de ports""" class Meta: model = Switch - fields = '__all__' - - def __init__(self, *args, **kwargs): - prefix = kwargs.pop('prefix', self.Meta.model.__name__) - super(EditSwitchForm, self).__init__(*args, prefix=prefix, **kwargs) - self.fields['switch_interface'].queryset = Interface.objects.all()\ - .select_related('domain__extension') - self.fields['location'].label = 'Localisation' - self.fields['number'].label = 'Nombre de ports' + fields = ['machine', 'type', 'ipv4', 'mac_address', 'details', 'location', 'number', 'stack', 'stack_member_id'] -class NewSwitchForm(ModelForm): +class NewSwitchForm(EditInterfaceForm): """Permet de créer un switch : emplacement, paramètres machine, membre d'un stack (option), nombre de ports (number)""" class Meta(EditSwitchForm.Meta): - fields = ['location', 'number', 'details', 'stack', 'stack_member_id'] + fields = ['type', 'ipv4', 'mac_address', 'details', 'location', 'number', 'stack', 'stack_member_id'] - def __init__(self, *args, **kwargs): - prefix = kwargs.pop('prefix', self.Meta.model.__name__) - super(NewSwitchForm, self).__init__(*args, prefix=prefix, **kwargs) - self.fields['location'].label = 'Localisation' - self.fields['number'].label = 'Nombre de ports' class EditRoomForm(ModelForm): """Permet d'éediter le nom et commentaire d'une prise murale""" diff --git a/topologie/migrations/0037_auto_20180325_0127.py b/topologie/migrations/0037_auto_20180325_0127.py new file mode 100644 index 00000000..30b34e58 --- /dev/null +++ b/topologie/migrations/0037_auto_20180325_0127.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-03-25 00:27 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('machines', '0076_auto_20180130_1623'), + ('topologie', '0036_transferborne'), + ] + + operations = [ + migrations.CreateModel( + name='NewSwitch', + fields=[ + ('interface_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='machines.Interface')), + ('location', models.CharField(max_length=255)), + ('number', models.PositiveIntegerField()), + ('stack_member_id', models.PositiveIntegerField(blank=True, null=True)), + ('model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='topologie.ModelSwitch')), + ('stack', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='topologie.Stack')), + ], + bases=('machines.interface',), + ), + migrations.AlterUniqueTogether( + name='newswitch', + unique_together=set([('stack', 'stack_member_id')]), + ), + ] diff --git a/topologie/migrations/0038_transfersw.py b/topologie/migrations/0038_transfersw.py new file mode 100644 index 00000000..6f79825f --- /dev/null +++ b/topologie/migrations/0038_transfersw.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-12-31 19:53 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('topologie', '0037_auto_20180325_0127'), + ] + + def transfer_sw(apps, schema_editor): + db_alias = schema_editor.connection.alias + newswitch = apps.get_model("topologie", "NewSwitch") + switch = apps.get_model("topologie", "Switch") + interface = apps.get_model("machines", "Interface") + sw_list = switch.objects.using(db_alias).all() + for sw in sw_list: + new_sw = newswitch() + new_sw.location = sw.location + new_sw.number = sw.number + new_sw.details = sw.details + new_sw.stack = sw.stack + new_sw.stack_member_id = sw.stack_member_id + new_sw.model = sw.model + new_sw.interface_ptr_id = sw.switch_interface.pk + new_sw.__dict__.update(sw.switch_interface.__dict__) + new_sw.save() + + def untransfer_sw(apps, schema_editor): + return + + operations = [ + migrations.RunPython(transfer_sw, untransfer_sw), + ] diff --git a/topologie/migrations/0039_port_new_switch.py b/topologie/migrations/0039_port_new_switch.py new file mode 100644 index 00000000..33dda2b4 --- /dev/null +++ b/topologie/migrations/0039_port_new_switch.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-03-25 00:52 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('topologie', '0038_transfersw'), + ] + + operations = [ + migrations.AddField( + model_name='port', + name='new_switch', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ports', to='topologie.NewSwitch'), + ), + ] diff --git a/topologie/migrations/0040_transferports.py b/topologie/migrations/0040_transferports.py new file mode 100644 index 00000000..7f72edc2 --- /dev/null +++ b/topologie/migrations/0040_transferports.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-12-31 19:53 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('topologie', '0039_port_new_switch'), + ] + + def transfer_port(apps, schema_editor): + db_alias = schema_editor.connection.alias + port = apps.get_model("topologie", "Port") + switch = apps.get_model("topologie", "NewSwitch") + port_list = port.objects.using(db_alias).all() + for p in port_list: + p.new_switch = switch.objects.filter(interface_ptr=p.switch.switch_interface).first() + p.save() + + def untransfer_port(apps, schema_editor): + return + + operations = [ + migrations.RunPython(transfer_port, untransfer_port), + ] diff --git a/topologie/migrations/0041_transferportsw.py b/topologie/migrations/0041_transferportsw.py new file mode 100644 index 00000000..a629c7e6 --- /dev/null +++ b/topologie/migrations/0041_transferportsw.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-12-31 19:53 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('topologie', '0040_transferports'), + ] + + operations = [ + migrations.RemoveField( + model_name='port', + name='switch', + ), + migrations.RenameField('Port', 'new_switch', 'switch') + ] diff --git a/topologie/migrations/0042_transferswitch.py b/topologie/migrations/0042_transferswitch.py new file mode 100644 index 00000000..96ad49dc --- /dev/null +++ b/topologie/migrations/0042_transferswitch.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-12-31 19:53 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('topologie', '0041_transferportsw'), + ] + + operations = [ + migrations.DeleteModel( + name='Switch', + ), + ] diff --git a/topologie/migrations/0043_renamenewswitch.py b/topologie/migrations/0043_renamenewswitch.py new file mode 100644 index 00000000..3deeced4 --- /dev/null +++ b/topologie/migrations/0043_renamenewswitch.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-12-31 19:53 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('topologie', '0042_transferswitch'), + ] + + operations = [ + migrations.RenameModel(old_name='NewSwitch', new_name='Switch'), + ] diff --git a/topologie/models.py b/topologie/models.py index 5c48773f..e0891f18 100644 --- a/topologie/models.py +++ b/topologie/models.py @@ -156,7 +156,7 @@ class Borne(Interface): return True, None -class Switch(models.Model): +class Switch(Interface): """ Definition d'un switch. Contient un nombre de ports (number), un emplacement (location), un stack parent (optionnel, stack) et un id de membre dans le stack (stack_member_id) @@ -170,13 +170,9 @@ class Switch(models.Model): id_max de la stack parente""" PRETTY_NAME = "Switch / Commutateur" - switch_interface = models.OneToOneField( - 'machines.Interface', - on_delete=models.CASCADE - ) + location = models.CharField(max_length=255) number = models.PositiveIntegerField() - details = models.CharField(max_length=255, blank=True) stack = models.ForeignKey( 'topologie.Stack', blank=True, @@ -224,11 +220,10 @@ class Switch(models.Model): return False, u"Vous n'avez pas le droit de voir les switch" return True, None - def __str__(self): - return self.location + ' ' + str(self.switch_interface) - def clean(self): - """ Verifie que l'id stack est dans le bon range""" + """ Verifie que l'id stack est dans le bon range + Appelle également le clean de la classe parente""" + super(Switch, self).clean() if self.stack is not None: if self.stack_member_id is not None: if (self.stack_member_id > self.stack.member_id_max) or\ @@ -421,7 +416,7 @@ class Port(models.Model): def get_instance(port_id, *args, **kwargs): return Port.objects\ - .select_related('switch__switch_interface__domain__extension')\ + .select_related('switch__domain__extension')\ .select_related('machine_interface__domain__extension')\ .select_related('machine_interface__switch')\ .select_related('room')\ diff --git a/topologie/templates/topologie/aff_switch.html b/topologie/templates/topologie/aff_switch.html index 38980736..c8c9e6e0 100644 --- a/topologie/templates/topologie/aff_switch.html +++ b/topologie/templates/topologie/aff_switch.html @@ -46,10 +46,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,