Skip to content

Commit 6e6670c

Browse files
committed
a stab at supporting a value getter to enable dataclass support
1 parent 64a5331 commit 6e6670c

File tree

18 files changed

+1181
-92
lines changed

18 files changed

+1181
-92
lines changed

django_enum/converters.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
"""
55

66
from enum import Enum
7-
from typing import Dict, Type
7+
from typing import Dict, Optional, Type, Union, cast
88

99
from django.urls.converters import register_converter
1010

11-
from django_enum.utils import determine_primitive
11+
from django_enum.utils import ValueGetter, determine_primitive
1212

1313
__all__ = ["register_enum_converter"]
1414

@@ -36,14 +36,21 @@ def to_url(self, value):
3636
return str(getattr(value, self.prop))
3737

3838

39-
def register_enum_converter(enum: Type[Enum], type_name="", prop="value"):
39+
def register_enum_converter(
40+
enum: Type[Enum],
41+
type_name="",
42+
prop="value",
43+
value: Optional[Union[str, ValueGetter]] = None,
44+
):
4045
"""
4146
Register an enum converter for Django's URL dispatcher.
4247
4348
:param enum: The enumeration type to register.
4449
:param type_name: the name to use for the converter
4550
:param prop: The property name to use to generate urls - by default the
4651
value is used.
52+
:param value: The property or method to use to get the primitive value
53+
from the enumeration instance (if different than "value").
4754
"""
4855
register_converter(
4956
type(
@@ -52,7 +59,12 @@ def register_enum_converter(enum: Type[Enum], type_name="", prop="value"):
5259
{
5360
"enum": enum,
5461
"prop": prop,
55-
"primitive": determine_primitive(enum),
62+
"primitive": determine_primitive(
63+
enum,
64+
value=cast(ValueGetter, lambda e: getattr(e, value))
65+
if isinstance(value, str)
66+
else value,
67+
),
5668
"regex": "|".join([str(getattr(env, prop)) for env in enum]),
5769
"_lookup_": {str(getattr(env, prop)): env for env in enum},
5870
},

0 commit comments

Comments
 (0)