diff --git a/peeringdb_server/management/commands/pdb_api_test.py b/peeringdb_server/management/commands/pdb_api_test.py index 5b9ce340..823b7036 100644 --- a/peeringdb_server/management/commands/pdb_api_test.py +++ b/peeringdb_server/management/commands/pdb_api_test.py @@ -1174,6 +1174,30 @@ class TestJSON(unittest.TestCase): test_success=False, ) + ########################################################################## + + def test_org_admin_002_POST_net_looking_glass_url(self): + for scheme in ["http","https","ssh","telnet"]: + r_data = self.assert_create( + self.db_org_admin, + "net", + self.make_data_net(asn=9000900, looking_glass="{}://foo.bar".format(scheme)), + test_failures={"invalid": {"looking_glass": "foo://www.bar.com"}} + ) + Network.objects.get(id=r_data["id"]).delete(hard=True) + + ########################################################################## + + def test_org_admin_002_POST_net_route_server_url(self): + for scheme in ["http","https","ssh","telnet"]: + r_data = self.assert_create( + self.db_org_admin, + "net", + self.make_data_net(asn=9000900, route_server="{}://foo.bar".format(scheme)), + test_failures={"invalid": {"route_server": "foo://www.bar.com"}} + ) + Network.objects.get(id=r_data["id"]).delete(hard=True) + ########################################################################## def test_org_admin_002_POST_net_deleted(self): data = self.make_data_net(asn=SHARED["net_rw_dupe_deleted"].asn) diff --git a/peeringdb_server/migrations/0031_auto_20200404_0910.py b/peeringdb_server/migrations/0031_auto_20200404_0910.py new file mode 100644 index 00000000..f3cb9bb5 --- /dev/null +++ b/peeringdb_server/migrations/0031_auto_20200404_0910.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.9 on 2020-04-04 09:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('peeringdb_server', '0030_affiliation_request_status_add_canceled'), + ] + + operations = [ + migrations.AlterField( + model_name='network', + name='info_never_via_route_servers', + field=models.BooleanField(default=False, help_text='Indicates if this network will announce its routes via route servers or not'), + ), + ] diff --git a/peeringdb_server/migrations/0032_net_lg_rs_url.py b/peeringdb_server/migrations/0032_net_lg_rs_url.py new file mode 100644 index 00000000..03786a21 --- /dev/null +++ b/peeringdb_server/migrations/0032_net_lg_rs_url.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.9 on 2020-04-04 09:11 + +from django.db import migrations +import django_peeringdb.models.abstract + + +class Migration(migrations.Migration): + + dependencies = [ + ('peeringdb_server', '0031_auto_20200404_0910'), + ] + + operations = [ + migrations.AlterField( + model_name='network', + name='looking_glass', + field=django_peeringdb.models.abstract.LG_URLField(blank=True, max_length=255), + ), + migrations.AlterField( + model_name='network', + name='route_server', + field=django_peeringdb.models.abstract.LG_URLField(blank=True, max_length=255), + ), + ] diff --git a/peeringdb_server/serializers.py b/peeringdb_server/serializers.py index 9a93201d..d1757a0c 100644 --- a/peeringdb_server/serializers.py +++ b/peeringdb_server/serializers.py @@ -3,7 +3,7 @@ import re import reversion from django_inet.rest import IPAddressField, IPPrefixField -from django_inet.models import URLValidator +from django.core.validators import URLValidator from django.db.models.query import QuerySet from django.db.models import Prefetch, Q, Sum, IntegerField, Case, When from django.db import models, transaction, IntegrityError @@ -320,8 +320,9 @@ class FieldMethodValidator(object): class ExtendedURLField(serializers.URLField): def __init__(self, **kwargs): + schemes = kwargs.pop("schemes", None) super(ExtendedURLField, self).__init__(**kwargs) - validator = URLValidator(message=self.error_messages["invalid"]) + validator = URLValidator(message=self.error_messages["invalid"], schemes=schemes) self.validators = [] self.validators.append(validator) @@ -1533,7 +1534,16 @@ class NetworkSerializer(ModelSerializer): ) org = serializers.SerializerMethodField() - route_server = ExtendedURLField(required=False, allow_blank=True) + route_server = serializers.CharField( + required=False, allow_blank=True, + validators=[URLValidator(schemes=["http", "https", "telnet", "ssh"])] + ) + + looking_glass = serializers.CharField( + required=False, allow_blank=True, + validators=[URLValidator(schemes=["http", "https", "telnet", "ssh"])] + ) + info_prefixes4 = SaneIntegerField( allow_null=False, required=False, validators=[validate_info_prefixes4]