Add Field ToolValidator

This example emulates the Add Field tool validation. Since Add Field is a built-in tool, it doesn't have a ToolValidator class. But if it did, it would look something like this.

For review, here are the parameters for Add Field and their data types:

This example emulates the Add Field tool validation

class ToolValidator:

    def __init__(self):
        import arcpy 
        self.params = arcpy.GetParameterInfo()

    def initializeParameters(self):
        # The derived output is a clone (copy) of the input
        #
        self.params[10].parameterDependencies = [0]
        self.params[10].schema.clone = True

        # Set up the field type list
        #
        self.params[2].filter.list = ["TEXT", "FLOAT", "DOUBLE",
                                      "SHORT", "LONG", "DATE",
                                      "BLOB", "RASTER"]

        # The default field type is LONG
        #
        self.params[2].value = "LONG"

        # Field scale & Length are disabled for LONG types
        #
        self.params[4].enabled = False
        self.params[5].enabled = False

        # Set the Boolean filters for IsNullable and IsRequired and
        #  their default values
        #
        self.params[7].filter.list = ["NULLABLE", "NON_NULLABLE"]
        self.params[7].value = "NULLABLE"
        
        self.params[8].filter.list = ["REQUIRED", "NON_REQUIRED"]
        self.params[8].value = "NON_REQUIRED"

        return

    def updateParameters(self):
        # Set the default field type value unless the user altered it
        #
        if not self.params[2].altered:
            self.params[2].value = "LONG"

        # Enable/Disable parameters based on field type
        #
        fieldType = self.params[2].value.upper()
        if fieldType in ["TEXT", "BLOB"]:
            self.params[3].enabled = False
            self.params[4].enabled = False
            self.params[5].enabled = True
        elif fieldType in ["FLOAT", "DOUBLE"]:
            self.params[3].enabled = True
            self.params[4].enabled = True
            self.params[5].enabled = False
        elif fieldType in ["SHORT", "LONG"]:
            self.params[3].enabled = True
            self.params[4].enabled = False
            self.params[5].enabled = False
        elif fieldType in ["DATE", "RASTER"]:
            self.params[3].enabled = False
            self.params[4].enabled = False
            self.params[5].enabled = False
        else:
            # Unknown field type.  Internal validation will catch this
            #  and show an error. We might as well return here and let
            #  internal validation do its work.
            #
            return
        
        # Update the output schema with the new field. Don't do anything
        #  unless we have an input value and a field name
        #
        if self.params[0].value and self.params[1].value:
            newField = arcpy.Field()
            newField.name = self.params[1].value
            newField.type = self.params[2].value

            # Set up the field properties based on type of field
            #
            if self.params[3].value and self.params[3].enabled:
                newField.precision = self.params[3].value
            if self.params[4].value and self.params[4].enabled:
                newField.scale = self.params[4].value
            if self.params[5].value and self.params[5].enabled:
                newField.length = self.params[5].value
                
            if self.params[6].value:
                newField.aliasName = self.params[6].value
                
            newField.isNullable = self.params[7].value

            # Note: IsRequired is not a property on a field object -- it's
            #  handled internally by the Add Field system tool.
            # 
            if self.params[9].value:
                newField.domain = self.params[9].value

            # Set the additional field on the output schema
            #
            self.params[10].schema.additionalFields = [newField]

    def updateMessages(self):
        return
3/25/2013