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 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): def run(self, data, commit):
try: try:
self.check_tenant_exists(data)
validate_prefix = self.check_prefix_exists(data)
tenant_slug = slugify(data["tenant_name"]) 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 = { 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,23 +190,21 @@ 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']} уже существует") prefix = Prefix(
return prefix=data["prefix_cidr"],
prefix = Prefix( tenant=tenant,
prefix=data["prefix_cidr"], description=data.get("prefix_description") or "",
tenant=tenant, vrf=data["prefix_vrf"],
description=data.get("prefix_description") or "", role=data["prefix_role"],
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.custom_field_data["Project"] = data["tenant_tr"] prefix.full_clean()
prefix.custom_field_data["zadacha"] = data["tenant_prefix_task"] prefix.save()
prefix.full_clean() self.log_success(
prefix.save() f"Создан префикс {prefix.prefix} для оператора: {tenant.name}"
self.log_success( )
f"Создан префикс {prefix.prefix} для оператора: {tenant.name}"
)
if data.get("contacts_fio"): if data.get("contacts_fio"):
contact = Contact( contact = Contact(
name=data["contacts_fio"], name=data["contacts_fio"],