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