2023-06-29 16:01:52 +02:00
|
|
|
import typing
|
2022-06-03 08:09:47 -06:00
|
|
|
|
|
|
|
|
from django.conf import settings
|
|
|
|
|
from django.core.validators import MinLengthValidator
|
|
|
|
|
from django.db import models
|
|
|
|
|
from django.db.models import F
|
|
|
|
|
from django.utils import timezone
|
|
|
|
|
|
|
|
|
|
from common.public_primary_keys import generate_public_primary_key, increase_public_primary_key_length
|
|
|
|
|
|
2023-06-29 16:01:52 +02:00
|
|
|
if typing.TYPE_CHECKING:
|
|
|
|
|
from django.db.models.manager import RelatedManager
|
|
|
|
|
|
|
|
|
|
from apps.alerts.models import EscalationPolicy
|
|
|
|
|
|
|
|
|
|
|
2022-06-03 08:09:47 -06:00
|
|
|
def generate_public_primary_key_for_custom_button():
|
|
|
|
|
prefix = "K"
|
|
|
|
|
new_public_primary_key = generate_public_primary_key(prefix)
|
|
|
|
|
|
|
|
|
|
failure_counter = 0
|
|
|
|
|
while CustomButton.objects.filter(public_primary_key=new_public_primary_key).exists():
|
|
|
|
|
new_public_primary_key = increase_public_primary_key_length(
|
|
|
|
|
failure_counter=failure_counter, prefix=prefix, model_name="CustomButton"
|
|
|
|
|
)
|
|
|
|
|
failure_counter += 1
|
|
|
|
|
|
|
|
|
|
return new_public_primary_key
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CustomButtonQueryset(models.QuerySet):
|
|
|
|
|
def delete(self):
|
|
|
|
|
self.update(deleted_at=timezone.now(), name=F("name") + "_deleted_" + F("public_primary_key"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CustomButtonManager(models.Manager):
|
|
|
|
|
def get_queryset(self):
|
|
|
|
|
return CustomButtonQueryset(self.model, using=self._db).filter(deleted_at=None)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CustomButton(models.Model):
|
2023-06-29 16:01:52 +02:00
|
|
|
escalation_policies: "RelatedManager['EscalationPolicy']"
|
|
|
|
|
|
2022-06-03 08:09:47 -06:00
|
|
|
objects = CustomButtonManager()
|
|
|
|
|
|
|
|
|
|
public_primary_key = models.CharField(
|
|
|
|
|
max_length=20,
|
|
|
|
|
validators=[MinLengthValidator(settings.PUBLIC_PRIMARY_KEY_MIN_LENGTH + 1)],
|
|
|
|
|
unique=True,
|
|
|
|
|
default=generate_public_primary_key_for_custom_button,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
organization = models.ForeignKey(
|
|
|
|
|
"user_management.Organization", on_delete=models.CASCADE, related_name="custom_buttons"
|
|
|
|
|
)
|
|
|
|
|
team = models.ForeignKey(
|
|
|
|
|
"user_management.Team",
|
|
|
|
|
on_delete=models.SET_NULL,
|
|
|
|
|
related_name="custom_buttons",
|
|
|
|
|
null=True,
|
|
|
|
|
default=None,
|
|
|
|
|
)
|
|
|
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
|
name = models.CharField(max_length=100)
|
|
|
|
|
webhook = models.CharField(max_length=1000, null=True, default=None)
|
|
|
|
|
data = models.TextField(null=True, default=None)
|
|
|
|
|
user = models.CharField(max_length=100, null=True, default=None)
|
|
|
|
|
password = models.CharField(max_length=100, null=True, default=None)
|
|
|
|
|
deleted_at = models.DateTimeField(blank=True, null=True)
|
|
|
|
|
authorization_header = models.CharField(max_length=1000, null=True, default=None)
|
|
|
|
|
forward_whole_payload = models.BooleanField(default=False)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
unique_together = ("name", "organization")
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return str(self.name)
|