diff --git a/peeringdb_server/management/commands/pdb_api_test.py b/peeringdb_server/management/commands/pdb_api_test.py index 9a70c56a..a4a7d8a2 100644 --- a/peeringdb_server/management/commands/pdb_api_test.py +++ b/peeringdb_server/management/commands/pdb_api_test.py @@ -1329,7 +1329,7 @@ class TestJSON(unittest.TestCase): #}, test_success=False) self.assert_update(self.db_org_admin, "ixpfx", SHARED["ixpfx_id"], - {"prefix": "206.126.236.0/24"}, test_failures={ + {"prefix": "206.127.236.0/26"}, test_failures={ "invalid": { "prefix": "NEEDS TO BE VALID PREFIX" }, diff --git a/peeringdb_server/models.py b/peeringdb_server/models.py index 65f480f6..208c47d0 100644 --- a/peeringdb_server/models.py +++ b/peeringdb_server/models.py @@ -37,7 +37,8 @@ from passlib.hash import sha256_crypt from peeringdb_server.inet import RdapLookup, RdapNotFoundError from peeringdb_server.validators import ( - validate_address_space, validate_info_prefixes4, validate_info_prefixes6) + validate_address_space, validate_info_prefixes4, validate_info_prefixes6, + validate_prefix_overlap) SPONSORSHIP_LEVELS = ((1, _("Silver")), (2, _("Gold")), (3, _("Platinum")), (4, _("Diamond"))) @@ -1775,12 +1776,14 @@ class IXLanPrefix(pdb_models.IXLanPrefixBase): except ValueError as inst: return False + def clean(self): """ Custom model validation """ # validate the specified prefix address validate_address_space(self.prefix) + validate_prefix_overlap(self.prefix) return super(IXLanPrefix, self).clean() diff --git a/peeringdb_server/serializers.py b/peeringdb_server/serializers.py index 0796652e..81a530fe 100644 --- a/peeringdb_server/serializers.py +++ b/peeringdb_server/serializers.py @@ -27,7 +27,8 @@ from peeringdb_server.models import ( InternetExchangeFacility, IXLan, IXLanPrefix, Facility, Network, NetworkContact, NetworkFacility, NetworkIXLan, Organization) from peeringdb_server.validators import ( - validate_address_space, validate_info_prefixes4, validate_info_prefixes6) + validate_address_space, validate_info_prefixes4, validate_info_prefixes6, + validate_prefix_overlap) from django.utils.translation import ugettext_lazy as _ @@ -1461,7 +1462,9 @@ class IXLanPrefixSerializer(ModelSerializer): prefix = IPPrefixField(validators=[ validators.UniqueValidator( - queryset=IXLanPrefix.objects.all()), validate_address_space + queryset=IXLanPrefix.objects.all()), + validate_address_space, + validate_prefix_overlap, ]) class Meta: @@ -1614,7 +1617,8 @@ class InternetExchangeSerializer(ModelSerializer): prefix = IPPrefixField(validators=[ validators.UniqueValidator( queryset=IXLanPrefix.objects.filter(status__in=["ok", "pending"])), - validate_address_space + validate_address_space, + validate_prefix_overlap, ], required=False, write_only=True) validators = [ diff --git a/peeringdb_server/static/site.css b/peeringdb_server/static/site.css index fdd8516f..d6329034 100644 --- a/peeringdb_server/static/site.css +++ b/peeringdb_server/static/site.css @@ -842,6 +842,12 @@ div.editable.mode-edit div.view_field { background-color: #9e1e1e; } +.input-note-long .input-note { + white-space:normal; + top:auto; + bottom:25px; +} + div.view > div.editable.popin.error { margin-top: 20px; max-width: 600px; diff --git a/peeringdb_server/templates/site/view_exchange_bottom.html b/peeringdb_server/templates/site/view_exchange_bottom.html index a4721c4c..5eb8ce35 100644 --- a/peeringdb_server/templates/site/view_exchange_bottom.html +++ b/peeringdb_server/templates/site/view_exchange_bottom.html @@ -145,7 +145,7 @@ data-edit-name="protocol" data-edit-data="enum/protocols"> -