diff --git a/peeringdb_server/management/commands/pdb_api_test.py b/peeringdb_server/management/commands/pdb_api_test.py index a4a7d8a2..e390c7ad 100644 --- a/peeringdb_server/management/commands/pdb_api_test.py +++ b/peeringdb_server/management/commands/pdb_api_test.py @@ -1106,6 +1106,16 @@ class TestJSON(unittest.TestCase): "asn": 9999999 }}, test_success=False) + ########################################################################## + def test_org_admin_002_POST_net_deleted(self): + data = self.make_data_net(asn=SHARED["net_rw_dupe_deleted"].asn) + + with self.assertRaises(InvalidRequestException) as exc: + r_data = self.db_org_admin.create("net", data, return_response=True) + + assert exc.exception.extra["asn"].find("Network has been deleted. Please contact") == 0 + + ########################################################################## def test_org_admin_002_POST_PUT_DELETE_as_set(self): diff --git a/peeringdb_server/serializers.py b/peeringdb_server/serializers.py index 81a530fe..06a19f68 100644 --- a/peeringdb_server/serializers.py +++ b/peeringdb_server/serializers.py @@ -1385,6 +1385,14 @@ class NetworkSerializer(ModelSerializer): # this happens here so it is done before the validators run if "suggest" in data: data["org_id"] = settings.SUGGEST_ENTITY_ORG + + # if an asn exists already but is currently deleted, fail + # with a specific error message indicating it (#288) + + if Network.objects.filter(asn=data.get("asn"), status="deleted").exists(): + errmsg = _("Network has been deleted. Please contact {}").format(settings.DEFAULT_FROM_EMAIL) + raise RestValidationError({"asn":errmsg}) + return super(NetworkSerializer, self).to_internal_value(data) def has_create_perms(self, user, data): @@ -1446,6 +1454,7 @@ class NetworkSerializer(ModelSerializer): ticket_queue_rdap_error(*rdap_error) + class IXLanPrefixSerializer(ModelSerializer): """ Serializer for peeringdb_server.models.IXLanPrefix