# This is a true allow list with things that we really don't care about.
# `allowlist_todo.txt` is autogenerated by `stubtest --generate-allowlist`
# and might contain actual problems and things that we *do want* to fix.
#
# Please, move things here when you are sure that they really should be ignored.
# Comments about why things are ignored are mandatory.

# We don't need locales:
django.conf.locale.*

# We don't need migrations:
django.contrib.admin.migrations.*
django.contrib.auth.migrations.*
django.contrib.contenttypes.migrations.*
django.contrib.flatpages.migrations.*
django.contrib.redirects.migrations.*
django.contrib.sessions.migrations.*
django.contrib.sites.migrations.*

# `python -m django` entry point: everything is behind `if __name__ == "__main__"`,
# so there is nothing importable to stub. Same as the locale and migration modules above.
django.__main__

# Note: At runtime, these are `LazyObject` or `ConnectionProxy` instances.
# However, to avoid type degradation, we stub them using the underlying target type instead.
#
# Why? Both wrapper classes define `__getattr__(self, name: str) -> Any`.
# Type-hinting as the wrapper would turn every attribute access into `Any`.
django.contrib.admin.sites.site
django.contrib.staticfiles.finders.DefaultStorageFinder.storage
django.contrib.staticfiles.storage.staticfiles_storage
django.core.cache.cache
django.core.files.storage.default_storage
django.db.connection
django.tasks.default_task_backend

# path/re_path are actually functools.partial objects at runtime, but stubs type them as functions
django.urls.conf.path
django.urls.conf.re_path

# '<Model>_RelatedManager' entries are plugin generated and these subclasses only exist
# _locally/dynamically_ runtime -- Created via
# 'django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager'
django.contrib.admin.models.LogEntry_RelatedManager
django.contrib.auth.models.Permission_RelatedManager

# '<Model>_ManyRelatedManager' entries are plugin generated and these subclasses only exist
# _locally/dynamically_ runtime -- Created via
# 'django.db.models.fields.related_descriptors.create_forward_many_to_many_manager'
django.contrib.auth.models.Group_ManyRelatedManager
django.contrib.auth.models.Permission_ManyRelatedManager
django.contrib.auth.models.User_ManyRelatedManager
django.contrib.flatpages.models.FlatPage_ManyRelatedManager
django.contrib.sites.models.Site_ManyRelatedManager

# BaseArchive abstract methods that take no argument, but typed with arguments to match the Archive and TarArchive Implementations
django.utils.archive.BaseArchive.list
django.utils.archive.BaseArchive.extract

# Runtime default is the cached_property descriptor itself
django.contrib.auth.password_validation.CommonPasswordValidator.__init__

# Promise is lazy, see notes in .pyi
django.utils.functional.Promise.__init__
django.utils.functional.Promise.__add__
django.utils.functional.Promise.__deepcopy__
django.utils.functional.Promise.__radd__
django.utils.functional.Promise.__mod__

# DEFAULT_TRIM_VALUE is a SimpleLazyObject at runtime, which causes stubtest to crash
# when trying to infer its type as a LiteralType (stubtest bug).
django.contrib.gis.geos.prototypes.io.DEFAULT_TRIM_VALUE

# `classonlymethod` is an alias for `@classmethod` which is disjoint:
django.utils.decorators.classonlymethod

# At runtime these return functools.partial via class_or_instance_method descriptor
django.db.models.query_utils.RegisterLookupMixin.get_lookups
django.db.models.query_utils.RegisterLookupMixin.register_lookup
django.db.models.query_utils.RegisterLookupMixin._unregister_lookup

# Lazy regex
django.contrib.admin.utils.UNQUOTE_RE
django.contrib.admindocs.utils.named_group_matcher
django.contrib.admindocs.utils.non_capturing_group_matcher
django.contrib.admindocs.utils.unnamed_group_matcher
django.contrib.gis.db.models.lookups.RelateLookup.pattern_regex
django.contrib.gis.geometry.hex_regex
django.contrib.gis.geometry.json_regex
django.contrib.gis.geometry.wkt_regex
django.contrib.postgres.search.multiple_spaces_re
django.contrib.postgres.search.spec_chars_re
django.core.cache.backends.base.memcached_error_chars_re
django.core.validators.EmailValidator.domain_regex
django.core.validators.EmailValidator.literal_regex
django.core.validators.EmailValidator.user_regex
django.core.validators.slug_re
django.core.validators.slug_unicode_re
django.core.validators.URLValidator.regex
django.core.management.commands.makemessages.plural_forms_re
django.core.management.commands.runserver.naiveip_re
django.db.backends.mysql.base.server_version_re
django.db.backends.mysql.compiler.SQLCompiler.ordering_parts
django.db.backends.sqlite3.base.FORMAT_QMARK_REGEX
django.db.backends.sqlite3.introspection.field_size_re
django.db.models.functions.comparison.Collate.collation_re
django.db.models.sql.compiler.SQLCompiler.ordering_parts
django.forms.fields.IntegerField.re_decimal
django.forms.widgets.SelectDateWidget.date_re
django.http.request.host_validation_re
django.middleware.csrf.invalid_token_chars_re
django.middleware.gzip.re_accepts_gzip
django.template.base.filter_re
django.template.base.kwarg_re
django.test.client.CONTENT_TYPE_RE
django.test.client.JSON_CONTENT_TYPE_RE
django.test.html.ASCII_WHITESPACE
django.utils.dateformat.re_escaped
django.utils.dateformat.re_formatchars
django.utils.dateparse.date_re
django.utils.dateparse.datetime_re
django.utils.dateparse.iso8601_duration_re
django.utils.dateparse.postgres_interval_re
django.utils.dateparse.standard_duration_re
django.utils.dateparse.time_re
django.utils.html.Urlizer.simple_url_2_re
django.utils.html.Urlizer.simple_url_re
django.utils.html.Urlizer.word_split_re
django.utils.html.long_open_tag_without_closing_re
django.utils.http.ASCTIME_DATE
django.utils.http.ETAG_MATCH
django.utils.http.RFC1123_DATE
django.utils.http.RFC850_DATE
django.utils.text.re_newlines
django.utils.text.re_camel_case
django.utils.text.smart_split_re
django.utils.translation.trans_real.language_code_re
django.utils.translation.trans_real.language_code_prefix_re
django.utils.translation.trans_real.accept_language_re
django.utils.translation.template.plural_re
django.utils.translation.template.inline_re
django.utils.translation.template.endblock_re
django.utils.translation.template.dot_re
django.utils.translation.template.context_re
django.utils.translation.template.constant_re
django.utils.translation.template.block_re
django.utils.version.version_component_re
django.views.debug.SafeExceptionReporterFilter.hidden_settings
django.http.multipartparser.MultiPartParser.boundary_re

# AlterTogetherOptionOperation.option_name is set as None,
# but is required in the init, so we type it as str
django.db.migrations.operations.models.AlterTogetherOptionOperation.option_name

# These are set to None in the base class but *must* be overridden
# because they are required in the init, so we type them without the None option.
django.contrib.gis.db.backends.spatialite.base.DatabaseWrapper.ops
django.db.backends.base.base.BaseDatabaseWrapper.SchemaEditorClass
django.db.backends.base.base.BaseDatabaseWrapper.client_class
django.db.backends.base.base.BaseDatabaseWrapper.creation_class
django.db.backends.base.base.BaseDatabaseWrapper.features_class
django.db.backends.base.base.BaseDatabaseWrapper.introspection_class
django.db.backends.base.base.BaseDatabaseWrapper.ops
django.db.backends.base.base.BaseDatabaseWrapper.ops_class
django.db.backends.mysql.base.DatabaseWrapper.ops
django.db.backends.postgresql.base.DatabaseWrapper.ops
django.db.backends.sqlite3.base.DatabaseWrapper.ops

# Attributes defaulting to None messing with mypy
django.contrib.admin.options.InlineModelAdmin.model
django.contrib.admin.options.InlineModelAdmin.template
django.views.generic.detail.SingleObjectMixin.model
django.views.generic.edit.BaseDeleteView.form_class

# Dynamically added via django.core.management.color.make_style
django.core.management.color.Style.ERROR
django.core.management.color.Style.ERROR_OUTPUT
django.core.management.color.Style.HTTP_BAD_REQUEST
django.core.management.color.Style.HTTP_INFO
django.core.management.color.Style.HTTP_NOT_FOUND
django.core.management.color.Style.HTTP_NOT_MODIFIED
django.core.management.color.Style.HTTP_REDIRECT
django.core.management.color.Style.HTTP_SERVER_ERROR
django.core.management.color.Style.HTTP_SUCCESS
django.core.management.color.Style.MIGRATE_HEADING
django.core.management.color.Style.MIGRATE_LABEL
django.core.management.color.Style.NOTICE
django.core.management.color.Style.SQL_COLTYPE
django.core.management.color.Style.SQL_FIELD
django.core.management.color.Style.SQL_KEYWORD
django.core.management.color.Style.SQL_TABLE
django.core.management.color.Style.SUCCESS
django.core.management.color.Style.WARNING


# Custom __str__ that we don't want to overcomplicate:
django.forms.utils.RenderableMixin.__str__
django.forms.utils.RenderableMixin.__html__

# Dynamically added in ManyToManyField.contribute_to_class()
django.db.models.fields.related.ManyToManyField.m2m_db_table

# Dynamically added in ManyToManyField.contribute_to_related_class()
django.db.models.fields.related.ManyToManyField.m2m_column_name
django.db.models.fields.related.ManyToManyField.m2m_field_name
django.db.models.fields.related.ManyToManyField.m2m_reverse_field_name
django.db.models.fields.related.ManyToManyField.m2m_reverse_name
django.db.models.fields.related.ManyToManyField.m2m_reverse_target_field_name
django.db.models.fields.related.ManyToManyField.m2m_target_field_name

# Defined inside a signature (using the walrus operator)
django.core.management.utils.sentinel

# Plugin generated model instances for '.annotate' support
django.contrib.admin.models.LogEntry@AnnotatedWith
django.contrib.auth.base_user.AbstractBaseUser@AnnotatedWith
django.contrib.auth.models.AbstractUser@AnnotatedWith
django.contrib.auth.models.Group@AnnotatedWith
django.contrib.auth.models.Permission@AnnotatedWith
django.contrib.auth.models.PermissionsMixin@AnnotatedWith
django.contrib.auth.models.User@AnnotatedWith
django.contrib.contenttypes.models.ContentType@AnnotatedWith
django.contrib.flatpages.models.FlatPage@AnnotatedWith
django.contrib.gis.db.backends.oracle.models.OracleGeometryColumns@AnnotatedWith
django.contrib.gis.db.backends.oracle.models.OracleSpatialRefSys@AnnotatedWith
django.contrib.gis.db.backends.postgis.models.PostGISGeometryColumns@AnnotatedWith
django.contrib.gis.db.backends.postgis.models.PostGISSpatialRefSys@AnnotatedWith
django.contrib.gis.db.backends.spatialite.models.SpatialiteGeometryColumns@AnnotatedWith
django.contrib.gis.db.backends.spatialite.models.SpatialiteSpatialRefSys@AnnotatedWith
django.contrib.redirects.models.Redirect@AnnotatedWith
django.contrib.sessions.base_session.AbstractBaseSession@AnnotatedWith
django.contrib.sessions.models.Session@AnnotatedWith
django.contrib.sites.models.Site@AnnotatedWith
django.db.migrations.recorder.Migration@AnnotatedWith

# These are `UserModel = get_user_model()` lines, the plugin updates them to correct types
django.contrib.auth.backends.UserModel
django.contrib.auth.forms.UserModel
django.contrib.auth.views.UserModel

# Limited stubtest support for enums (https://github.com/python/mypy/issues/16806)
django.db.migrations.operations.base.OperationCategory.__new__

# These are dynamically added when using `save(commit=False)`
# See https://docs.djangoproject.com/en/stable/topics/forms/modelforms/#the-save-method
django.forms.models.BaseModelForm.save_m2m
django.forms.models.BaseModelFormSet.save_m2m

# Dynamically generated in https://github.com/django/django/blob/0ee06c04e0256094270db3ffe8b5dafa6a8457a3/django/core/mail/backends/locmem.py#L24
django.core.mail.outbox

# Variable is supposed to be a set but is initialised to an empty dict
django.contrib.gis.db.backends.base.features.BaseSpatialFeatures.unsupported_geojson_options

# We declare more strict types for this in stubs to avoid RuntimeErrors.
# Django uses a `*args` parameter but crash if it contains more than 1 element.
django.http.request.QueryDict.pop

# The `task` decorator supports both `@task` and `@task(...)` forms. Stubs use
# overloads to type each case separately, so `function` doesn't accept `None`.
django.tasks.base.task

# Django incorrectly uses a signature of `(cls, **kwargs)` when it should be `(cls, *args, **kwargs)`.
django.test.selenium.SeleniumTestCase.__init_subclass__

# mypy does not understand __getitem__ unpacking python/mypy#2220
django.urls.resolvers.ResolverMatch.__iter__

# The parameters form_class / choices_form_class are positional at runtime, but
# usage and docs always pass them as keyword args; additionally, all subclasses
# require them to be keyword-only, so require all usage to be keyword-only.
django.db.models.fields.Field.formfield

# `form` is a TypeVar with a PEP 696 default of `ModelForm[_M]`, so omitting it still ties the
# formset to the model. stubtest never resolves TypeVar defaults, so it can't tell that the
# runtime `ModelForm` default satisfies `type[_ModelFormT]`.
django.contrib.contenttypes.forms.generic_inlineformset_factory
django.forms.models.inlineformset_factory
django.forms.models.modelformset_factory

# Field.__get__/__set__ are stub-only for the mypy plugin, they don't exist at runtime
django.contrib.contenttypes.fields.GenericForeignKey.__get__
django.db.models.fields.Field.__get__
django.db.models.fields.Field.__set__
django.db.models.fields.files.FileField.__get__
django.db.models.fields.files.ImageField.__get__
django.db.models.fields.related.ForeignObject.__get__
django.db.models.fields.related.ManyToManyField.__get__
django.db.models.fields.related.OneToOneField.__get__

# These are dynamically added at runtime with loose types
django.utils.functional.LazyObject.__bool__
django.utils.functional.LazyObject.__bytes__
django.utils.functional.LazyObject.__dir__
django.utils.functional.LazyObject.__hash__
django.utils.functional.LazyObject.__iter__
django.utils.functional.LazyObject.__len__
django.utils.functional.LazyObject.__str__
