4
4
"""
5
5
6
6
from enum import Enum
7
- from typing import Dict , Type
7
+ from typing import Dict , Optional , Type , Union , cast
8
8
9
9
from django .urls .converters import register_converter
10
10
11
- from django_enum .utils import determine_primitive
11
+ from django_enum .utils import ValueGetter , determine_primitive
12
12
13
13
__all__ = ["register_enum_converter" ]
14
14
@@ -36,14 +36,21 @@ def to_url(self, value):
36
36
return str (getattr (value , self .prop ))
37
37
38
38
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
+ ):
40
45
"""
41
46
Register an enum converter for Django's URL dispatcher.
42
47
43
48
:param enum: The enumeration type to register.
44
49
:param type_name: the name to use for the converter
45
50
:param prop: The property name to use to generate urls - by default the
46
51
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").
47
54
"""
48
55
register_converter (
49
56
type (
@@ -52,7 +59,12 @@ def register_enum_converter(enum: Type[Enum], type_name="", prop="value"):
52
59
{
53
60
"enum" : enum ,
54
61
"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
+ ),
56
68
"regex" : "|" .join ([str (getattr (env , prop )) for env in enum ]),
57
69
"_lookup_" : {str (getattr (env , prop )): env for env in enum },
58
70
},
0 commit comments