|
@@ -1,13 +1,20 @@
|
|
|
import enum
|
|
|
+import warnings
|
|
|
from types import DynamicClassAttribute
|
|
|
|
|
|
+from django.utils.deprecation import RemovedInDjango60Warning
|
|
|
from django.utils.functional import Promise
|
|
|
-from django.utils.version import PY312
|
|
|
+from django.utils.version import PY311, PY312
|
|
|
+
|
|
|
+if PY311:
|
|
|
+ from enum import EnumType
|
|
|
+else:
|
|
|
+ from enum import EnumMeta as EnumType
|
|
|
|
|
|
__all__ = ["Choices", "IntegerChoices", "TextChoices"]
|
|
|
|
|
|
|
|
|
-class ChoicesMeta(enum.EnumMeta):
|
|
|
+class ChoicesType(EnumType):
|
|
|
"""A metaclass for creating a enum choices."""
|
|
|
|
|
|
def __new__(metacls, classname, bases, classdict, **kwds):
|
|
@@ -59,7 +66,7 @@ class ChoicesMeta(enum.EnumMeta):
|
|
|
return [value for value, _ in cls.choices]
|
|
|
|
|
|
|
|
|
-class Choices(enum.Enum, metaclass=ChoicesMeta):
|
|
|
+class Choices(enum.Enum, metaclass=ChoicesType):
|
|
|
"""Class for creating enumerated choices."""
|
|
|
|
|
|
@DynamicClassAttribute
|
|
@@ -93,3 +100,14 @@ class TextChoices(str, Choices):
|
|
|
|
|
|
def _generate_next_value_(name, start, count, last_values):
|
|
|
return name
|
|
|
+
|
|
|
+
|
|
|
+def __getattr__(name):
|
|
|
+ if name == "ChoicesMeta":
|
|
|
+ warnings.warn(
|
|
|
+ "ChoicesMeta is deprecated in favor of ChoicesType.",
|
|
|
+ RemovedInDjango60Warning,
|
|
|
+ stacklevel=2,
|
|
|
+ )
|
|
|
+ return ChoicesType
|
|
|
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|