Message service backend setup: switch config form per-service in the UI

See #281, which this commit prepares for
This commit is contained in:
Klaas van Schelven
2025-11-26 09:10:14 +01:00
parent e0e4104cae
commit 2a90d6ab1e
8 changed files with 141 additions and 33 deletions

View File

@@ -3,7 +3,7 @@ from django.forms import ModelForm
from .models import MessagingServiceConfig
class MessagingServiceConfigForm(ModelForm):
class MessagingServiceConfigNewForm(ModelForm):
def __init__(self, project, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -19,3 +19,13 @@ class MessagingServiceConfigForm(ModelForm):
if commit:
instance.save()
return instance
class MessagingServiceConfigEditForm(ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
class Meta:
model = MessagingServiceConfig
fields = ["display_name"]

View File

@@ -14,7 +14,7 @@ class Migration(migrations.Migration):
model_name="messagingserviceconfig",
name="kind",
field=models.CharField(
choices=alerts.models.kind_choices, default="slack", max_length=20
choices=alerts.models.get_alert_service_kind_choices, default="slack", max_length=20
),
),
]

View File

@@ -6,7 +6,7 @@ from .service_backends.mattermost import MattermostBackend
from .service_backends.discord import DiscordBackend
def kind_choices():
def get_alert_service_kind_choices():
# As a callable to avoid non-DB-affecting migrations for adding new kinds.
# Messaging backends don't need translations since they are brand names.
return [
@@ -16,12 +16,22 @@ def kind_choices():
]
def get_alert_service_backend_class(kind):
if kind == "discord":
return DiscordBackend
if kind == "mattermost":
return MattermostBackend
if kind == "slack":
return SlackBackend
raise ValueError(f"Unknown backend kind: {kind}")
class MessagingServiceConfig(models.Model):
project = models.ForeignKey(Project, on_delete=models.DO_NOTHING, related_name="service_configs")
display_name = models.CharField(max_length=100, blank=False,
help_text='For display in the UI, e.g. "#general on company Slack"')
kind = models.CharField(choices=kind_choices, max_length=20, default="slack")
kind = models.CharField(choices=get_alert_service_kind_choices, max_length=20, default="slack")
config = models.TextField(blank=False)
@@ -40,13 +50,7 @@ class MessagingServiceConfig(models.Model):
help_text="Error message from the exception")
def get_backend(self):
if self.kind == "discord":
return DiscordBackend(self)
if self.kind == "mattermost":
return MattermostBackend(self)
if self.kind == "slack":
return SlackBackend(self)
raise ValueError(f"Unknown backend kind: {self.kind}")
return get_alert_service_backend_class(self.kind)(self)
def clear_failure_status(self):
"""Clear all failure tracking fields on successful operation"""

View File

@@ -203,7 +203,8 @@ class DiscordBackend:
def __init__(self, service_config):
self.service_config = service_config
def get_form_class(self):
@classmethod
def get_form_class(cls):
return DiscordConfigForm
def send_test_message(self):

View File

@@ -185,7 +185,8 @@ class MattermostBackend:
def __init__(self, service_config):
self.service_config = service_config
def get_form_class(self):
@classmethod
def get_form_class(cls):
return MattermostConfigForm
def send_test_message(self):

View File

@@ -222,7 +222,8 @@ class SlackBackend:
def __init__(self, service_config):
self.service_config = service_config
def get_form_class(self):
@classmethod
def get_form_class(cls):
return SlackConfigForm
def send_test_message(self):