Source code for django_enum.urls
"""
A metaclass and converter for Django's URL dispatcher to use with Python's
Enum class.
"""
from enum import Enum
from django.urls.converters import register_converter
from django_enum.utils import determine_primitive
__all__ = ["register_enum_converter"]
class _EnumConverter:
enum: type[Enum]
prop: str = "value"
primitive: type
regex: str = ".+"
_lookup_: dict[str, Enum]
def to_python(self, value: str) -> Enum:
"""
Convert the string representation of the enum into an instance of it.
"""
return self._lookup_[value]
def to_url(self, value: Enum) -> str:
"""
Convert the given enumeration value to its url string.
:param value: The enumeration value
:return: the string representation of the enumeration value
"""
return str(getattr(value, self.prop))
[docs]
def register_enum_converter(enum: type[Enum], type_name="", prop="value"):
"""
Register an enum converter for Django's URL dispatcher.
:param enum: The enumeration type to register.
:param type_name: the name to use for the converter, defaults to the enum class
name:
.. code-block:: python
path("<type_name:kwarg_name>", view, view_name)
:param prop: The property name to use in the urls - by default the value is used.
"""
register_converter(
type(
f"{enum.__name__}Converter",
(_EnumConverter,),
{
"enum": enum,
"prop": prop,
"primitive": determine_primitive(enum),
"regex": "|".join([str(getattr(env, prop)) for env in enum]),
"_lookup_": {str(getattr(env, prop)): env for env in enum},
},
),
type_name or enum.__name__,
)