diff --git a/src/olympia/scanners/migrations/0089_alter_scannerwebhook_name.py b/src/olympia/scanners/migrations/0089_alter_scannerwebhook_name.py new file mode 100644 index 000000000000..ba637f4c091a --- /dev/null +++ b/src/olympia/scanners/migrations/0089_alter_scannerwebhook_name.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.17 on 2026-09-03 12:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('scanners', '0088_alter_scannerqueryrule_run_on_specific_channel'), + ] + + operations = [ + migrations.AlterField( + model_name='scannerwebhook', + name='name', + field=models.CharField(max_length=100, unique=True), + ), + ] diff --git a/src/olympia/scanners/models.py b/src/olympia/scanners/models.py index 288960b209a0..d28a8c49d71d 100644 --- a/src/olympia/scanners/models.py +++ b/src/olympia/scanners/models.py @@ -345,7 +345,7 @@ class Meta(AbstractScannerRule.Meta): class ScannerWebhook(ModelBase): - name = models.CharField(max_length=100) + name = models.CharField(max_length=100, unique=True) url = models.URLField(max_length=255) api_key = models.CharField(max_length=255) is_active = models.BooleanField(default=True) diff --git a/src/olympia/scanners/tests/test_models.py b/src/olympia/scanners/tests/test_models.py index e179dd6db39d..f5f29b5d2d01 100644 --- a/src/olympia/scanners/tests/test_models.py +++ b/src/olympia/scanners/tests/test_models.py @@ -3,6 +3,7 @@ from unittest import mock from django.core.exceptions import ValidationError +from django.db.utils import IntegrityError import pytest import time_machine @@ -849,3 +850,13 @@ def test_save_does_not_recreate_service_account_on_rename(self): assert webhook.service_account == original_account assert UserProfile.objects.count() == expected_count + + def test_name_is_unique(self): + ScannerWebhook.objects.create( + name='some-name', url='https://example.com', api_key='secret' + ) + + with pytest.raises(IntegrityError): + ScannerWebhook.objects.create( + name='some-name', url='https://example.org', api_key='other-secret' + )