oncall-engine/engine/apps/alerts/models/escalation_chain.py
Joey Orlando cc20c9dfdd
re-enable mypy GitHub Actions CI job (#2390)
# What this PR does

```bash
❯ mypy .
Success: no issues found in 595 source files
```

- re-enable the mypy CI check
- fixes all `django-manager-missing` mypy errors
- disable all other rules currently giving mypy errors
- changing the approach here. rather than enforcing that backend
contributors fix >= 1 `mypy` error on their PR, lets simply disable all
the rules that're currently returning errors and slowly re-enable these
one at a time #2392

## Checklist

- [ ] Unit, integration, and e2e (if applicable) tests updated (N/A)
- [ ] Documentation added (or `pr:no public docs` PR label added if not
required) (N/A)
- [ ] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required) (N/A)
2023-06-29 14:01:52 +00:00

108 lines
3.5 KiB
Python

import typing
from django.conf import settings
from django.core.validators import MinLengthValidator
from django.db import models, transaction
from apps.alerts.models.escalation_policy import generate_public_primary_key_for_escalation_policy
from common.public_primary_keys import generate_public_primary_key, increase_public_primary_key_length
if typing.TYPE_CHECKING:
from django.db.models.manager import RelatedManager
from apps.alerts.models import ChannelFilter, EscalationPolicy
def generate_public_primary_key_for_escalation_chain():
prefix = "F"
new_public_primary_key = generate_public_primary_key(prefix)
failure_counter = 0
while EscalationChain.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="EscalationChain"
)
failure_counter += 1
return new_public_primary_key
class EscalationChain(models.Model):
channel_filters: "RelatedManager['ChannelFilter']"
escalation_policies: "RelatedManager['EscalationPolicy']"
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_escalation_chain,
)
organization = models.ForeignKey(
"user_management.Organization", on_delete=models.CASCADE, related_name="escalation_chains"
)
team = models.ForeignKey(
"user_management.Team",
on_delete=models.SET_NULL,
related_name="escalation_chains",
null=True,
default=None,
)
name = models.CharField(max_length=100)
class Meta:
unique_together = ("organization", "name")
def __str__(self):
return f"{self.pk}: {self.name}"
def make_copy(self, copy_name: str, team):
with transaction.atomic():
copied_chain = EscalationChain.objects.create(
organization=self.organization,
team=team,
name=copy_name,
)
for escalation_policy in self.escalation_policies.all():
# https://docs.djangoproject.com/en/3.2/topics/db/queries/#copying-model-instances
notify_to_users_queue = escalation_policy.notify_to_users_queue.all()
escalation_policy.pk = None
escalation_policy.public_primary_key = generate_public_primary_key_for_escalation_policy()
escalation_policy.last_notified_user = None
escalation_policy.escalation_chain = copied_chain
escalation_policy.save()
escalation_policy.notify_to_users_queue.set(notify_to_users_queue)
return copied_chain
# Insight logs
@property
def insight_logs_type_verbal(self):
return "escalation_chain"
@property
def insight_logs_verbal(self):
return self.name
@property
def insight_logs_serialized(self):
result = {
"name": self.name,
}
if self.team:
result["team"] = self.team.name
result["team_id"] = self.team.public_primary_key
else:
result["team"] = "General"
return result
@property
def insight_logs_metadata(self):
result = {}
if self.team:
result["team"] = self.team.name
result["team_id"] = self.team.public_primary_key
else:
result["team"] = "General"
return result