@startuml 
!include ./schemes_setup.wsd

Title Cisco FTD pydantic rule scheme

class CiscoFTDPolicyPyModel {
    action : str
    applications : Optional[List]
    destination_networks : Optional[List]
    destination_ports : Optional[List]
    destination_zones : Optional[List]
    logging : Optional[]
    name : str
    position : int
    rule_hits : int
    safe_search : bool
    source_networks : Optional[List]
    source_ports : Optional[List]
    source_zones : Optional[List]
    time_range : Optional[]
    url_entries : Optional[List]
    usernames : Optional[List]
    variable_set : str
}



class CiscoFTDLoggingModel {
    device_connector_beginning : bool
    device_connector_end : bool
    device_connector_files : bool
    enabled : bool
}
CiscoFTDPolicyPyModel::logging o-- CiscoFTDLoggingModel

class CiscoFTDZonePyModel {
  name : str
}
CiscoFTDPolicyPyModel::source_zones o-- CiscoFTDZonePyModel
CiscoFTDPolicyPyModel::destination_zones o-- CiscoFTDZonePyModel

class CiscoFTDURLEntryPyModel {
  name : str
  url : str
}
CiscoFTDPolicyPyModel::url_entries o-- CiscoFTDURLEntryPyModel

class CiscoFTDUsernamePyModel {
  username : str
}
CiscoFTDPolicyPyModel::usernames o-- CiscoFTDUsernamePyModel

package ports {
    class CiscoFTDPortPyModel {
        name : str
        port : Union[]
        protocol : int
    }
    CiscoFTDPolicyPyModel::source_ports o-- CiscoFTDPortPyModel
    CiscoFTDPolicyPyModel::destination_ports o-- CiscoFTDPortPyModel

    class CiscoFTDPortSingleValuePyModel {
        value : int
    }
    CiscoFTDPortPyModel::port o-- CiscoFTDPortSingleValuePyModel

    class CiscoFTDPortRangeValuePyModel {
        end : int
        start : int
    }
    CiscoFTDPortPyModel::port o-- CiscoFTDPortRangeValuePyModel

    
}


package time_range{
    class CiscoFTDTimeRangePyModel {
        eff_end_datetime : Optional[str]
        eff_start_datetime : Optional[str]
        name : str
        time_range : Union[]
        time_range_type
    }
    CiscoFTDPolicyPyModel::time_range o-- CiscoFTDTimeRangePyModel

    class CiscoFTDTimeRangeRangeIntervalPyModel {
        end_day : Optional[str]
        end_time : Optional[str]
        start_day : Optional[str]
        start_time : Optional[str]
    }
    CiscoFTDTimeRangeRangeIntervalPyModel o-- CiscoFTDTimeRangePyModel::time_range

    class CiscoFTDTimeRangeDailyIntervalPyModel {
        days : Optional[str]
        end_time : Optional[str]
        start_time : Optional[str]
    }
    CiscoFTDTimeRangeDailyIntervalPyModel o-- CiscoFTDTimeRangePyModel::time_range
}

package source_destinations {

    class CiscoFTDNetworkRootPyModel {
        name : str
        object_type: Enum
    }
    CiscoFTDPolicyPyModel::source_networks o-- CiscoFTDNetworkRootPyModel
    CiscoFTDPolicyPyModel::destination_networks o-- CiscoFTDNetworkRootPyModel

    class CiscoFTDNetworkCountriesGroupPyModel {
        countries_count : int
    }
    CiscoFTDNetworkRootPyModel <|-- CiscoFTDNetworkCountriesGroupPyModel

    class CiscoFTDNetworkCountryPyModel {
    }
    CiscoFTDNetworkRootPyModel <|-- CiscoFTDNetworkCountryPyModel

    class CiscoFTDNetworkFQDNObjectPyModel {
        fqdn_address : str
    }
    CiscoFTDNetworkRootPyModel <|-- CiscoFTDNetworkFQDNObjectPyModel

    class CiscoFTDNetworkGroupPyModel {
    }
    CiscoFTDNetworkRootPyModel <|-- CiscoFTDNetworkGroupPyModel

    class CiscoFTDNetworkIPv4NetworkPyModel {
        address : str
        netmask : Optional[int]
    }
    CiscoFTDNetworkRootPyModel <|-- CiscoFTDNetworkIPv4NetworkPyModel

    class CiscoFTDNetworkIPv6NetworkPyModel {
        address : str
        prefix_length : Optional[int]
    }
    CiscoFTDNetworkRootPyModel <|-- CiscoFTDNetworkIPv6NetworkPyModel

    class CiscoFTDNetworkRangePyModel {
        end_address : str
        start_address : str
    }
    CiscoFTDNetworkRootPyModel <|-- CiscoFTDNetworkRangePyModel
}

@enduml