diff --git a/netbox_routing/migrations/0017_eigrprouter_netbox_routing_eigrprouter_unique_device_name_and_more.py b/netbox_routing/migrations/0017_eigrprouter_netbox_routing_eigrprouter_unique_device_name_and_more.py new file mode 100644 index 0000000..6ddbc2c --- /dev/null +++ b/netbox_routing/migrations/0017_eigrprouter_netbox_routing_eigrprouter_unique_device_name_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 5.2.2 on 2025-10-30 08:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('netbox_routing', '0016_ospfinterface_interface_onetoonefield'), + ] + + operations = [ + migrations.AddConstraint( + model_name='eigrprouter', + constraint=models.UniqueConstraint( + fields=('device', 'name'), + name='netbox_routing_eigrprouter_unique_device_name', + nulls_distinct=False, + violation_error_message="""Name must be unique per device.\n + Only a single empty name is permitted per device""", + ), + ), + migrations.AddConstraint( + model_name='ospfinstance', + constraint=models.UniqueConstraint( + fields=('device', 'name'), + name='netbox_routing_ospfinstance_unique_device_name', + nulls_distinct=False, + violation_error_message="""Name must be unique per device.\n + Only a single empty name is permitted per device""", + ), + ), + ] diff --git a/netbox_routing/models/eigrp.py b/netbox_routing/models/eigrp.py index dd199ab..8fd66eb 100644 --- a/netbox_routing/models/eigrp.py +++ b/netbox_routing/models/eigrp.py @@ -38,6 +38,15 @@ class EIGRPRouter(PrimaryModel): class Meta: verbose_name = 'EIGRP Router' + constraints = ( + models.UniqueConstraint( + fields=('device', 'name'), + name='%(app_label)s_%(class)s_unique_device_name', + violation_error_message="""Name must be unique per device. + Only a single empty name is permitted per device""", + nulls_distinct=False, + ), + ) def __str__(self): if self.pid: diff --git a/netbox_routing/models/ospf.py b/netbox_routing/models/ospf.py index aa13587..a77c960 100644 --- a/netbox_routing/models/ospf.py +++ b/netbox_routing/models/ospf.py @@ -44,6 +44,15 @@ class OSPFInstance(PrimaryModel): class Meta: ordering = ['vrf', 'router_id', 'process_id'] verbose_name = 'OSPF Instance' + constraints = ( + models.UniqueConstraint( + fields=('device', 'name'), + name='%(app_label)s_%(class)s_unique_device_name', + violation_error_message="""Name must be unique per device. + Only a single empty name is permitted per device""", + nulls_distinct=False, + ), + ) def __str__(self): return f'{self.name} ({self.router_id})'