This commit is contained in:
IluaAir
2025-10-06 13:32:42 +03:00
parent b416d9d530
commit 12cbfef017

View File

@@ -5,6 +5,7 @@ from ipam.models import Prefix, VRF, Role
from extras.scripts import Script, StringVar, IPNetworkVar, ChoiceVar, ObjectVar
from django.core.exceptions import ValidationError
from extras.models import CustomField
from utilities.exceptions import AbortScript
def slugify(text: str):
@@ -90,6 +91,7 @@ class CreateTenant(Script):
class Meta:
name = "Создание Оператора"
description = "Создание оператора и связанного префикса"
scheduling_enabled = False
fieldsets = (
(
"Оператор",
@@ -131,7 +133,10 @@ class CreateTenant(Script):
description="URL или номер задачи из redmine, jira, CRM",
required=False,
)
prefix_cidr = IPNetworkVar(label="Префикс (CIDR)")
prefix_cidr = IPNetworkVar(
label="Префикс для оператора (CIDR) указывается с маской подсети"
)
prefix_vrf = ObjectVar(label="VRF проекта", model=VRF, required=True)
prefix_role = ObjectVar(label="Роль", model=Role, required=True)
prefix_description = StringVar(label="Описание префикса", required=False)
@@ -141,21 +146,29 @@ class CreateTenant(Script):
contacts_email = StringVar(label="E-mail", required=False)
contacts_role = ObjectVar(label="Роль контакта", model=ContactRole, required=False)
def check_tenant_exists(self, data):
if Tenant.objects.filter(name=data["tenant_name"]).exists():
self.log_failure(
f"Оператор с именем '{data['tenant_name']}' уже существует"
)
raise AbortScript(
f"Оператор с именем '{data['tenant_name']}' уже существует"
)
def check_prefix_exists(self, data):
if Prefix.objects.filter(prefix=data["prefix_cidr"]).exists():
self.log_warning(
f"Префикс {data['prefix_cidr']} уже существует, оператор будет создан без префикса"
)
return False
return True
def run(self, data, commit):
try:
self.check_tenant_exists(data)
validate_prefix = self.check_prefix_exists(data)
tenant_slug = slugify(data["tenant_name"])
if Tenant.objects.filter(name=data["tenant_name"]).exists():
self.log_failure(
f"Оператор с именем '{data['tenant_name']}' уже существует"
)
return
if Tenant.objects.filter(slug=tenant_slug).exists():
self.log_failure(
f"Оператор со slug '{data['tenant_slug']}' уже существует"
)
return
tenant_data = {
"name": data["tenant_name"],
"slug": tenant_slug,
@@ -167,7 +180,9 @@ class CreateTenant(Script):
tenant = Tenant(**tenant_data)
tenant.custom_field_data["dogovor"] = data["tenant_contract"]
tenant.custom_field_data["connection_type_tenant"] = data["tenant_connection_type"]
tenant.custom_field_data["connection_type_tenant"] = data[
"tenant_connection_type"
]
tenant.custom_field_data["link_on_docs"] = data["tenant_tr"]
tenant.full_clean()
if commit:
@@ -175,23 +190,21 @@ class CreateTenant(Script):
self.log_success(
f"Создан новый оператор: {tenant.name} - {tenant.slug}"
)
if Prefix.objects.filter(prefix=data["prefix_cidr"]).exists():
self.log_warning(f"Префикс {data['prefix_cidr']} уже существует")
return
prefix = Prefix(
prefix=data["prefix_cidr"],
tenant=tenant,
description=data.get("prefix_description") or "",
vrf=data["prefix_vrf"],
role=data["prefix_role"],
)
prefix.custom_field_data["Project"] = data["tenant_tr"]
prefix.custom_field_data["zadacha"] = data["tenant_prefix_task"]
prefix.full_clean()
prefix.save()
self.log_success(
f"Создан префикс {prefix.prefix} для оператора: {tenant.name}"
)
if validate_prefix:
prefix = Prefix(
prefix=data["prefix_cidr"],
tenant=tenant,
description=data.get("prefix_description") or "",
vrf=data["prefix_vrf"],
role=data["prefix_role"],
)
prefix.custom_field_data["Project"] = data["tenant_tr"]
prefix.custom_field_data["zadacha"] = data["tenant_prefix_task"]
prefix.full_clean()
prefix.save()
self.log_success(
f"Создан префикс {prefix.prefix} для оператора: {tenant.name}"
)
if data.get("contacts_fio"):
contact = Contact(
name=data["contacts_fio"],