import inspect import json import os import pkgutil import time import traceback from collections import OrderedDict import yaml from django import forms from django.conf import settings from django.core.validators import RegexValidator from django.db import transaction from mptt.forms import TreeNodeChoiceField, TreeNodeMultipleChoiceField from mptt.models import MPTTModel from ipam.formfields import IPFormField from utilities.exceptions import AbortTransaction from utilities.validators import MaxPrefixLengthValidator, MinPrefixLengthValidator from .constants import LOG_DEFAULT, LOG_FAILURE, LOG_INFO, LOG_SUCCESS, LOG_WARNING from .forms import ScriptForm from .signals import purge_changelog __all__ = [ 'BaseScript', 'BooleanVar', 'ChoiceVar', 'FileVar', 'IntegerVar', 'IPNetworkVar', 'MultiObjectVar', 'ObjectVar', 'Script', 'StringVar', 'TextVar', ] # # Script variables # class ScriptVariable: """ Base model for script variables """ form_field = forms.CharField def __init__(self, label='', description='', default=None, required=True): # Default field attributes self.field_attrs = { 'help_text': description, 'required': required } if label: self.field_attrs['label'] = label if default: self.field_attrs['initial'] = default def as_field(self): """ Render the variable as a Django form field. """ form_field = self.form_field(**self.field_attrs) if not isinstance(form_field.widget, forms.CheckboxInput): form_field.widget.attrs['class'] = 'form-control' return form_field class StringVar(ScriptVariable): """ Character string representation. Can enforce minimum/maximum length and/or regex validation. """ def __init__(self, min_length=None, max_length=None, regex=None, *args, **kwargs): super().__init__(*args, **kwargs) # Optional minimum/maximum lengths if min_length: self.field_attrs['min_length'] = min_length if max_length: self.field_attrs['max_length'] = max_length # Optional regular expression validation if regex: self.field_attrs['validators'] = [ RegexValidator( regex=regex, message='Invalid value. Must match regex: {}'.format(regex), code='invalid' ) ] class TextVar(ScriptVariable): """ Free-form text data. Renders as a