from collections import OrderedDict
from datetime import date, datetime, time, timedelta
from decimal import Decimal
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
from uuid import UUID

from django.core.files.base import File
from django.core.files.uploadedfile import SimpleUploadedFile
from django.db.models.fields.files import FieldFile
from django.forms.boundfield import BoundField
from django.forms.forms import BaseForm
from django.forms.widgets import Input, Widget


class Field:
    initial: None
    label: None
    required: bool
    widget: Any = ...
    hidden_widget: Any = ...
    default_validators: Any = ...
    default_error_messages: Any = ...
    empty_values: Any = ...
    show_hidden_initial: bool = ...
    help_text: str = ...
    disabled: bool = ...
    label_suffix: None = ...
    localize: bool = ...
    error_messages: Any = ...
    validators: Any = ...
    def __init__(
        self,
        *,
        required: bool = ...,
        widget: Optional[Any] = ...,
        label: Optional[Any] = ...,
        initial: Optional[Any] = ...,
        help_text: str = ...,
        error_messages: Optional[Any] = ...,
        show_hidden_initial: bool = ...,
        validators: Any = ...,
        localize: bool = ...,
        disabled: bool = ...,
        label_suffix: Optional[Any] = ...
    ) -> None: ...
    def prepare_value(self, value: Any) -> Any: ...
    def to_python(
        self,
        value: Optional[Union[List[None], List[str], datetime, float, str]],
    ) -> Optional[Union[List[None], List[str], datetime, float, str]]: ...
    def validate(self, value: Any) -> None: ...
    def run_validators(self, value: Any) -> None: ...
    def clean(self, value: Any) -> Any: ...
    def bound_data(self, data: Any, initial: Any) -> Any: ...
    def widget_attrs(self, widget: Widget) -> Dict[Any, Any]: ...
    def has_changed(
        self,
        initial: Optional[Union[datetime, Decimal, float, str]],
        data: Optional[str],
    ) -> bool: ...
    def get_bound_field(
        self, form: BaseForm, field_name: str
    ) -> BoundField: ...
    def __deepcopy__(
        self,
        memo: Dict[
            int,
            Union[
                List[Tuple[Union[int, str], str]],
                List[Widget],
                OrderedDict,
                Field,
                Widget,
            ],
        ],
    ) -> Field: ...

class CharField(Field):
    disabled: bool
    error_messages: Dict[str, str]
    help_text: str
    initial: Optional[Union[Callable, str]]
    label: Optional[str]
    label_suffix: Optional[str]
    localize: bool
    required: bool
    show_hidden_initial: bool
    validators: List[
        Union[
            django.core.validators.BaseValidator,
            django.core.validators.ProhibitNullCharactersValidator,
        ]
    ]
    widget: django.forms.widgets.TextInput
    max_length: Optional[Union[int, str]] = ...
    min_length: Optional[Union[int, str]] = ...
    strip: bool = ...
    empty_value: Optional[str] = ...
    def __init__(
        self,
        *,
        max_length: Optional[Any] = ...,
        min_length: Optional[Any] = ...,
        strip: bool = ...,
        empty_value: str = ...,
        **kwargs: Any
    ) -> None: ...
    def to_python(
        self, value: Optional[Union[List[int], Tuple, int, str]]
    ) -> Optional[str]: ...
    def widget_attrs(self, widget: Widget) -> Dict[str, str]: ...

class IntegerField(Field):
    disabled: bool
    error_messages: Dict[str, str]
    help_text: str
    initial: Optional[Union[Callable, int]]
    label: Optional[str]
    label_suffix: None
    localize: bool
    max_value: Optional[int]
    min_value: Optional[int]
    required: bool
    show_hidden_initial: bool
    validators: List[django.core.validators.BaseValidator]
    widget: django.forms.widgets.NumberInput = ...
    default_error_messages: Any = ...
    re_decimal: Any = ...
    def __init__(
        self,
        *,
        max_value: Optional[Any] = ...,
        min_value: Optional[Any] = ...,
        **kwargs: Any
    ) -> None: ...
    def to_python(
        self, value: Optional[Union[float, str]]
    ) -> Optional[int]: ...
    def widget_attrs(
        self, widget: Widget
    ) -> Dict[str, Union[Decimal, float]]: ...

class FloatField(IntegerField):
    disabled: bool
    error_messages: Dict[str, str]
    help_text: str
    initial: None
    label: Optional[str]
    label_suffix: None
    localize: bool
    max_value: Optional[float]
    min_value: Optional[float]
    required: bool
    show_hidden_initial: bool
    validators: List[django.core.validators.BaseValidator]
    widget: django.forms.widgets.NumberInput
    default_error_messages: Any = ...
    def to_python(
        self, value: Optional[Union[float, str]]
    ) -> Optional[float]: ...
    def validate(self, value: Optional[float]) -> None: ...
    def widget_attrs(self, widget: Input) -> Dict[str, Union[float, str]]: ...

class DecimalField(IntegerField):
    decimal_places: Optional[int]
    disabled: bool
    error_messages: Dict[str, str]
    help_text: str
    initial: None
    label: Optional[str]
    label_suffix: None
    localize: bool
    max_digits: Optional[int]
    max_value: Optional[Union[decimal.Decimal, int]]
    min_value: Optional[Union[decimal.Decimal, int]]
    required: bool
    show_hidden_initial: bool
    validators: List[
        Union[
            django.core.validators.BaseValidator,
            django.core.validators.DecimalValidator,
        ]
    ]
    widget: django.forms.widgets.NumberInput
    default_error_messages: Any = ...
    def __init__(
        self,
        *,
        max_value: Optional[Any] = ...,
        min_value: Optional[Any] = ...,
        max_digits: Optional[Any] = ...,
        decimal_places: Optional[Any] = ...,
        **kwargs: Any
    ) -> None: ...
    def to_python(
        self, value: Optional[Union[Decimal, float, str]]
    ) -> Optional[Decimal]: ...
    def validate(self, value: Optional[Decimal]) -> None: ...
    def widget_attrs(
        self, widget: Widget
    ) -> Dict[str, Union[Decimal, int, str]]: ...

class BaseTemporalField(Field):
    input_formats: Any = ...
    def __init__(
        self, *, input_formats: Optional[Any] = ..., **kwargs: Any
    ) -> None: ...
    def to_python(self, value: str) -> datetime: ...
    def strptime(self, value: Any, format: Any) -> None: ...

class DateField(BaseTemporalField):
    disabled: bool
    error_messages: Dict[str, str]
    help_text: str
    initial: Optional[Union[Callable, datetime.date]]
    label: Optional[str]
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    validators: List[Any]
    widget: django.forms.widgets.DateInput = ...
    input_formats: Any = ...
    default_error_messages: Any = ...
    def to_python(
        self, value: Optional[Union[date, str]]
    ) -> Optional[date]: ...
    def strptime(self, value: str, format: str) -> date: ...

class TimeField(BaseTemporalField):
    disabled: bool
    error_messages: Dict[str, str]
    help_text: str
    initial: Optional[Callable]
    label: Optional[str]
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    validators: List[Any]
    widget: django.forms.widgets.TimeInput = ...
    input_formats: Any = ...
    default_error_messages: Any = ...
    def to_python(
        self, value: Optional[Union[time, str]]
    ) -> Optional[time]: ...
    def strptime(self, value: str, format: str) -> time: ...

class DateTimeField(BaseTemporalField):
    disabled: bool
    error_messages: Dict[str, str]
    help_text: str
    initial: Optional[Union[Callable, datetime.datetime]]
    label: Optional[str]
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    validators: List[Any]
    widget: django.forms.widgets.DateTimeInput = ...
    input_formats: Any = ...
    default_error_messages: Any = ...
    def prepare_value(
        self, value: Optional[datetime]
    ) -> Optional[datetime]: ...
    def to_python(
        self, value: Optional[Union[date, str]]
    ) -> Optional[datetime]: ...
    def strptime(self, value: str, format: str) -> datetime: ...

class DurationField(Field):
    disabled: bool
    help_text: str
    initial: Optional[datetime.timedelta]
    label: None
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    default_error_messages: Any = ...
    def prepare_value(
        self, value: Optional[Union[timedelta, str]]
    ) -> Optional[str]: ...
    def to_python(self, value: Union[int, str]) -> timedelta: ...

class RegexField(CharField):
    disabled: bool
    empty_value: str
    error_messages: Dict[str, str]
    help_text: str
    initial: None
    label: None
    label_suffix: None
    localize: bool
    max_length: Optional[int]
    min_length: Optional[int]
    required: bool
    show_hidden_initial: bool
    strip: bool
    validators: List[
        Union[
            django.core.validators.BaseValidator,
            django.core.validators.ProhibitNullCharactersValidator,
            django.core.validators.RegexValidator,
        ]
    ]
    widget: django.forms.widgets.TextInput
    def __init__(self, regex: str, **kwargs: Any) -> None: ...
    regex: Any = ...

class EmailField(CharField):
    disabled: bool
    empty_value: Optional[str]
    error_messages: Dict[str, str]
    help_text: str
    initial: None
    label: Optional[str]
    label_suffix: None
    localize: bool
    max_length: Optional[int]
    min_length: Optional[int]
    required: bool
    show_hidden_initial: bool
    strip: bool
    validators: List[
        Union[
            django.core.validators.BaseValidator,
            django.core.validators.EmailValidator,
            django.core.validators.ProhibitNullCharactersValidator,
        ]
    ]
    widget: django.forms.widgets.EmailInput = ...
    default_validators: Any = ...
    def __init__(self, **kwargs: Any) -> None: ...

class FileField(Field):
    disabled: bool
    help_text: str
    initial: Optional[Union[Callable, str]]
    label: Optional[str]
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    widget: Any = ...
    default_error_messages: Any = ...
    max_length: Optional[int] = ...
    allow_empty_file: bool = ...
    def __init__(
        self,
        *,
        max_length: Optional[Any] = ...,
        allow_empty_file: bool = ...,
        **kwargs: Any
    ) -> None: ...
    def to_python(
        self, data: Optional[Union[SimpleUploadedFile, str]]
    ) -> Optional[SimpleUploadedFile]: ...
    def clean(
        self, data: Any, initial: Optional[Union[FieldFile, str]] = ...
    ) -> Optional[Union[bool, File, str]]: ...
    def bound_data(
        self, data: Any, initial: Optional[FieldFile]
    ) -> Optional[Union[File, str]]: ...
    def has_changed(
        self,
        initial: Optional[Union[FieldFile, str]],
        data: Optional[Union[Dict[str, str], str]],
    ) -> bool: ...

class ImageField(FileField):
    allow_empty_file: bool
    disabled: bool
    help_text: str
    initial: None
    label: Optional[str]
    label_suffix: None
    localize: bool
    max_length: Optional[int]
    required: bool
    show_hidden_initial: bool
    default_validators: Any = ...
    default_error_messages: Any = ...
    def to_python(
        self, data: Optional[SimpleUploadedFile]
    ) -> Optional[SimpleUploadedFile]: ...
    def widget_attrs(self, widget: Widget) -> Dict[str, str]: ...

class URLField(CharField):
    disabled: bool
    empty_value: Optional[str]
    error_messages: Dict[str, str]
    help_text: str
    initial: None
    label: Optional[str]
    label_suffix: None
    localize: bool
    max_length: Optional[int]
    min_length: Optional[int]
    required: bool
    show_hidden_initial: bool
    strip: bool
    validators: List[
        Union[
            django.core.validators.MaxLengthValidator,
            django.core.validators.ProhibitNullCharactersValidator,
            django.core.validators.URLValidator,
        ]
    ]
    widget: django.forms.widgets.URLInput = ...
    default_error_messages: Any = ...
    default_validators: Any = ...
    def __init__(self, **kwargs: Any) -> None: ...
    def to_python(self, value: Optional[Union[int, str]]) -> Optional[str]: ...

class BooleanField(Field):
    disabled: bool
    error_messages: Dict[str, str]
    help_text: str
    initial: Optional[int]
    label: Optional[str]
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    validators: List[Any]
    widget: django.forms.widgets.CheckboxInput = ...
    def to_python(self, value: Optional[Union[int, str]]) -> bool: ...
    def validate(self, value: bool) -> None: ...
    def has_changed(
        self,
        initial: Optional[Union[bool, str]],
        data: Optional[Union[bool, str]],
    ) -> bool: ...

class NullBooleanField(BooleanField):
    disabled: bool
    help_text: str
    initial: Optional[bool]
    label: Optional[str]
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    widget: Any = ...
    def to_python(
        self, value: Optional[Union[bool, str]]
    ) -> Optional[bool]: ...
    def validate(self, value: Optional[bool]) -> None: ...

class CallableChoiceIterator:
    choices_func: Callable = ...
    def __init__(self, choices_func: Callable) -> None: ...
    def __iter__(self) -> None: ...

class ChoiceField(Field):
    disabled: bool
    error_messages: Dict[str, str]
    help_text: str
    initial: None
    label: Optional[str]
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    validators: List[Any]
    widget: django.forms.widgets.Select = ...
    default_error_messages: Any = ...
    choices: Any = ...
    def __init__(self, *, choices: Any = ..., **kwargs: Any) -> None: ...
    def __deepcopy__(
        self,
        memo: Dict[
            int,
            Union[
                List[Tuple[Union[int, str], str]],
                List[Widget],
                OrderedDict,
                Field,
                Widget,
            ],
        ],
    ) -> ChoiceField: ...
    def to_python(self, value: Optional[Union[int, str]]) -> str: ...
    def validate(self, value: str) -> None: ...
    def valid_value(self, value: str) -> bool: ...

class TypedChoiceField(ChoiceField):
    disabled: bool
    help_text: str
    initial: Optional[Union[Callable, int]]
    label: Optional[str]
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    coerce: Union[Callable, Type[Union[bool, float, str]]] = ...
    empty_value: Optional[str] = ...
    def __init__(
        self, *, coerce: Any = ..., empty_value: str = ..., **kwargs: Any
    ) -> None: ...
    def clean(
        self, value: Optional[str]
    ) -> Optional[Union[Decimal, float, str]]: ...

class MultipleChoiceField(ChoiceField):
    disabled: bool
    error_messages: Dict[str, str]
    help_text: str
    initial: Optional[Callable]
    label: None
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    validators: List[Any]
    hidden_widget: Any = ...
    widget: django.forms.widgets.SelectMultiple = ...
    default_error_messages: Any = ...
    def to_python(
        self, value: Optional[Union[List[Union[int, str]], Tuple, str]]
    ) -> List[str]: ...
    def validate(self, value: List[str]) -> None: ...
    def has_changed(
        self,
        initial: Optional[Union[List[int], List[str], str]],
        data: Optional[Union[List[str], str]],
    ) -> bool: ...

class TypedMultipleChoiceField(MultipleChoiceField):
    disabled: bool
    help_text: str
    initial: None
    label: None
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    coerce: Union[Callable, Type[float]] = ...
    empty_value: Optional[List[Any]] = ...
    def __init__(self, *, coerce: Any = ..., **kwargs: Any) -> None: ...
    def clean(
        self, value: List[str]
    ) -> Optional[Union[List[bool], List[Decimal], List[float]]]: ...
    def validate(self, value: List[str]) -> None: ...

class ComboField(Field):
    disabled: bool
    help_text: str
    initial: None
    label: None
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    fields: Any = ...
    def __init__(self, fields: List[CharField], **kwargs: Any) -> None: ...
    def clean(self, value: Optional[str]) -> str: ...

class MultiValueField(Field):
    disabled: bool
    help_text: str
    initial: None
    label: None
    label_suffix: None
    localize: bool
    required: bool
    show_hidden_initial: bool
    default_error_messages: Any = ...
    require_all_fields: bool = ...
    fields: Any = ...
    def __init__(
        self,
        fields: Tuple[Field, Field],
        *,
        require_all_fields: bool = ...,
        **kwargs: Any
    ) -> None: ...
    def __deepcopy__(
        self,
        memo: Dict[
            int, Union[List[Tuple[str, str]], OrderedDict, Field, Widget]
        ],
    ) -> MultiValueField: ...
    def validate(self, value: Union[datetime, str]) -> None: ...
    def clean(
        self,
        value: Optional[
            Union[List[None], List[datetime], List[str], datetime, str]
        ],
    ) -> Optional[Union[datetime, str]]: ...
    def compress(self, data_list: Any) -> None: ...
    def has_changed(
        self,
        initial: Optional[Union[List[None], List[str], datetime, str]],
        data: Union[List[None], List[str]],
    ) -> bool: ...

class FilePathField(ChoiceField):
    allow_files: bool
    allow_folders: bool
    disabled: bool
    help_text: str
    initial: None
    label: Optional[str]
    label_suffix: None
    localize: bool
    match: Optional[str]
    path: str
    recursive: bool
    required: bool
    show_hidden_initial: bool
    choices: Any = ...
    match_re: Any = ...
    def __init__(
        self,
        path: str,
        *,
        match: Optional[Any] = ...,
        recursive: bool = ...,
        allow_files: bool = ...,
        allow_folders: bool = ...,
        **kwargs: Any
    ) -> None: ...

class SplitDateTimeField(MultiValueField):
    disabled: bool
    help_text: str
    initial: Optional[Union[Callable, datetime.datetime]]
    label: Optional[str]
    label_suffix: None
    localize: bool
    require_all_fields: bool
    required: bool
    show_hidden_initial: bool
    widget: Any = ...
    hidden_widget: Any = ...
    default_error_messages: Any = ...
    def __init__(
        self,
        *,
        input_date_formats: Optional[Any] = ...,
        input_time_formats: Optional[Any] = ...,
        **kwargs: Any
    ) -> None: ...
    def compress(
        self, data_list: List[Optional[datetime]]
    ) -> Optional[datetime]: ...

class GenericIPAddressField(CharField):
    disabled: bool
    empty_value: str
    error_messages: Dict[str, str]
    help_text: str
    initial: None
    label: None
    label_suffix: None
    localize: bool
    max_length: None
    min_length: None
    required: bool
    show_hidden_initial: bool
    strip: bool
    validators: List[Callable]
    widget: django.forms.widgets.TextInput
    unpack_ipv4: bool = ...
    default_validators: List[Callable] = ...
    def __init__(
        self, *, protocol: str = ..., unpack_ipv4: bool = ..., **kwargs: Any
    ) -> None: ...
    def to_python(self, value: Optional[str]) -> str: ...

class SlugField(CharField):
    disabled: bool
    empty_value: str
    help_text: str
    initial: None
    label: Optional[str]
    label_suffix: None
    localize: bool
    max_length: Optional[int]
    min_length: None
    required: bool
    show_hidden_initial: bool
    strip: bool
    default_validators: List[django.core.validators.RegexValidator] = ...
    allow_unicode: bool = ...
    def __init__(self, *, allow_unicode: bool = ..., **kwargs: Any) -> None: ...

class UUIDField(CharField):
    disabled: bool
    empty_value: str
    help_text: str
    initial: Optional[Callable]
    label: Optional[str]
    label_suffix: None
    localize: bool
    max_length: None
    min_length: None
    required: bool
    show_hidden_initial: bool
    strip: bool
    default_error_messages: Any = ...
    def prepare_value(self, value: UUID) -> str: ...
    def to_python(self, value: str) -> Optional[UUID]: ...
