diff --git a/netbox/circuits/migrations/0001_squashed.py b/netbox/circuits/migrations/0001_squashed.py index 656eb35a1..96fa3c086 100644 --- a/netbox/circuits/migrations/0001_squashed.py +++ b/netbox/circuits/migrations/0001_squashed.py @@ -1,4 +1,4 @@ -import dcim.fields +import ipam.fields from utilities.json import CustomFieldJSONEncoder from django.db import migrations, models import django.db.models.deletion @@ -77,7 +77,7 @@ class Migration(migrations.Migration): ('id', models.BigAutoField(primary_key=True, serialize=False)), ('name', models.CharField(max_length=100, unique=True)), ('slug', models.SlugField(max_length=100, unique=True)), - ('asn', dcim.fields.ASNField(blank=True, null=True)), + ('asn', ipam.fields.ASNField(blank=True, null=True)), ('account', models.CharField(blank=True, max_length=30)), ('portal_url', models.URLField(blank=True)), ('noc_contact', models.TextField(blank=True)), diff --git a/netbox/dcim/fields.py b/netbox/dcim/fields.py index 4a2755be9..cef3283bb 100644 --- a/netbox/dcim/fields.py +++ b/netbox/dcim/fields.py @@ -1,10 +1,8 @@ from django.contrib.postgres.fields import ArrayField from django.core.exceptions import ValidationError -from django.core.validators import MinValueValidator, MaxValueValidator from django.db import models from netaddr import AddrFormatError, EUI, eui64_unix_expanded, mac_unix_expanded -from ipam.constants import BGP_ASN_MAX, BGP_ASN_MIN from .lookups import PathContains __all__ = ( @@ -27,22 +25,6 @@ class eui64_unix_expanded_uppercase(eui64_unix_expanded): # Fields # -class ASNField(models.BigIntegerField): - description = "32-bit ASN field" - default_validators = [ - MinValueValidator(BGP_ASN_MIN), - MaxValueValidator(BGP_ASN_MAX), - ] - - def formfield(self, **kwargs): - defaults = { - 'min_value': BGP_ASN_MIN, - 'max_value': BGP_ASN_MAX, - } - defaults.update(**kwargs) - return super().formfield(**defaults) - - class MACAddressField(models.Field): description = "PostgreSQL MAC Address field" diff --git a/netbox/dcim/migrations/0001_squashed.py b/netbox/dcim/migrations/0001_squashed.py index 3d7156e17..cf0ef4816 100644 --- a/netbox/dcim/migrations/0001_squashed.py +++ b/netbox/dcim/migrations/0001_squashed.py @@ -1,4 +1,5 @@ import dcim.fields +import ipam.fields import django.contrib.postgres.fields from utilities.json import CustomFieldJSONEncoder import django.core.validators @@ -609,7 +610,7 @@ class Migration(migrations.Migration): ('slug', models.SlugField(max_length=100, unique=True)), ('status', models.CharField(default='active', max_length=50)), ('facility', models.CharField(blank=True, max_length=50)), - ('asn', dcim.fields.ASNField(blank=True, null=True)), + ('asn', ipam.fields.ASNField(blank=True, null=True)), ('time_zone', timezone_field.fields.TimeZoneField(blank=True)), ('description', models.CharField(blank=True, max_length=200)), ('physical_address', models.CharField(blank=True, max_length=200)), diff --git a/netbox/ipam/constants.py b/netbox/ipam/constants.py index cb121515d..f26fce2b5 100644 --- a/netbox/ipam/constants.py +++ b/netbox/ipam/constants.py @@ -2,10 +2,6 @@ from django.db.models import Q from .choices import FHRPGroupProtocolChoices, IPAddressRoleChoices -# BGP ASN bounds -BGP_ASN_MIN = 1 -BGP_ASN_MAX = 2**32 - 1 - # # VRFs diff --git a/netbox/ipam/fields.py b/netbox/ipam/fields.py index 7d28127a4..2d55deae4 100644 --- a/netbox/ipam/fields.py +++ b/netbox/ipam/fields.py @@ -1,10 +1,21 @@ from django.core.exceptions import ValidationError +from django.core.validators import MinValueValidator, MaxValueValidator from django.db import models from netaddr import AddrFormatError, IPNetwork from . import lookups, validators from .formfields import IPNetworkFormField +__all__ = ( + 'ASNField', + 'IPAddressField', + 'IPNetworkField', +) + +# BGP ASN bounds +BGP_ASN_MIN = 1 +BGP_ASN_MAX = 2**32 - 1 + class BaseIPField(models.Field): @@ -93,3 +104,19 @@ IPAddressField.register_lookup(lookups.NetIn) IPAddressField.register_lookup(lookups.NetHostContained) IPAddressField.register_lookup(lookups.NetFamily) IPAddressField.register_lookup(lookups.NetMaskLength) + + +class ASNField(models.BigIntegerField): + description = "32-bit ASN field" + default_validators = [ + MinValueValidator(BGP_ASN_MIN), + MaxValueValidator(BGP_ASN_MAX), + ] + + def formfield(self, **kwargs): + defaults = { + 'min_value': BGP_ASN_MIN, + 'max_value': BGP_ASN_MAX, + } + defaults.update(**kwargs) + return super().formfield(**defaults) diff --git a/netbox/ipam/migrations/0053_asn_model.py b/netbox/ipam/migrations/0053_asn_model.py index 3b074634c..99bde12e6 100644 --- a/netbox/ipam/migrations/0053_asn_model.py +++ b/netbox/ipam/migrations/0053_asn_model.py @@ -1,6 +1,4 @@ -# Generated by Django 3.2.8 on 2021-11-02 16:16 - -import dcim.fields +import ipam.fields from utilities.json import CustomFieldJSONEncoder from django.db import migrations, models import django.db.models.deletion @@ -23,7 +21,7 @@ class Migration(migrations.Migration): ('last_updated', models.DateTimeField(auto_now=True, null=True)), ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=CustomFieldJSONEncoder)), ('id', models.BigAutoField(primary_key=True, serialize=False)), - ('asn', dcim.fields.ASNField(unique=True)), + ('asn', ipam.fields.ASNField(unique=True)), ('description', models.CharField(blank=True, max_length=200)), ('rir', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='asns', to='ipam.rir')), ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), diff --git a/netbox/ipam/models/asns.py b/netbox/ipam/models/asns.py index 3d8a8e3f7..c4b7c022f 100644 --- a/netbox/ipam/models/asns.py +++ b/netbox/ipam/models/asns.py @@ -1,8 +1,9 @@ +from django.contrib.postgres.fields import ArrayField from django.db import models from django.urls import reverse from django.utils.translation import gettext as _ -from dcim.fields import ASNField +from ipam.fields import ASNField from netbox.models import PrimaryModel __all__ = (