From 12cbfef017fb699acc9a5f38baacf53420f13709 Mon Sep 17 00:00:00 2001 From: IluaAir Date: Mon, 6 Oct 2025 13:32:42 +0300 Subject: [PATCH] refactor --- add_tenant_with_prefix.py | 75 +++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/add_tenant_with_prefix.py b/add_tenant_with_prefix.py index 3ecaad8..35db8b2 100644 --- a/add_tenant_with_prefix.py +++ b/add_tenant_with_prefix.py @@ -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"],