Python's Enum with extra powers to play nice with labels and choices fields.
- Free software: BSD license
- Documentation: https://python-choicesenum.readthedocs.io.
Install choicesenum using pip:
$ pip install choicesenum
- An
ChoicesEnumthat can be used to create constant groups. ChoicesEnumcan define labels to be used in choices fields.- Django fields included:
EnumCharFieldandEnumIntegerField. - Support (tested) for Python 2.7, 3.4, 3.5 and 3.6.
- Support (tested) for Django 1.6.1 (with south), 1.7, 1.8, 1.9, 1.10 and 1.11.
Example with HttpStatuses:
class HttpStatuses(ChoicesEnum):
OK = 200
BAD_REQUEST = 400
UNAUTHORIZED = 401
FORBIDDEN = 403All Enum types can be compared against their values:
assert HttpStatuses.OK == 200
assert HttpStatuses.BAD_REQUEST == 400
assert HttpStatuses.UNAUTHORIZED == 401
assert HttpStatuses.FORBIDDEN == 403
status_code = HttpStatuses.OK
assert 200 <= status_code <= 300All Enum types have by default a display derived from the enum identifier:
assert HttpStatuses.OK.display == 'Ok'
assert HttpStatuses.BAD_REQUEST.display == 'Bad request'
assert HttpStatuses.UNAUTHORIZED.display == 'Unauthorized'
assert HttpStatuses.FORBIDDEN.display == 'Forbidden'You can easily define your own custom display for an Enum item using a tuple:
class HttpStatuses(ChoicesEnum):
OK = 200, 'Everything is fine'
BAD_REQUEST = 400, 'You did a mistake'
UNAUTHORIZED = 401, 'I know your IP'
FORBIDDEN = 403
assert HttpStatuses.OK.display == 'Everything is fine'
assert HttpStatuses.BAD_REQUEST.display == 'You did a mistake'
assert HttpStatuses.UNAUTHORIZED.display == 'I know your IP'
assert HttpStatuses.FORBIDDEN.display == 'Forbidden'You can declare custom properties and methods:
class HttpStatuses(ChoicesEnum):
OK = 200, 'Everything is fine'
BAD_REQUEST = 400, 'You did a mistake'
UNAUTHORIZED = 401, 'I know your IP'
FORBIDDEN = 403
@property
def is_error(self):
return self >= self.BAD_REQUEST
assert HttpStatuses.OK.is_error is False
assert HttpStatuses.BAD_REQUEST.is_error is True
assert HttpStatuses.UNAUTHORIZED.is_error is TrueExample with Colors:
from choicesenum import ChoicesEnum
class Colors(ChoicesEnum):
# For fixed order in py2.7, py3.4+ are ordered by default
_order_ = 'RED GREEN BLUE'
RED = '#f00', 'Vermelho'
GREEN = '#0f0', 'Verde'
BLUE = '#00f', 'Azul'
assert Colors.RED == '#f00'
assert Colors.GREEN == '#0f0'
assert Colors.BLUE == '#00f'
assert Colors.RED.display == 'Vermelho'
assert Colors.GREEN.display == 'Verde'
assert Colors.BLUE.display == 'Azul'Use .choices() method to receive a list of tuples (item, display):
# choices
assert list(Colors.choices()) == [
('#f00', 'Vermelho'),
('#0f0', 'Verde'),
('#00f', 'Azul'),
]For each enum item, a dynamic property is_<enum_item> is generated to allow
quick boolean checks:
color = Colors.RED
assert color.is_red
assert not color.is_blue
assert not color.is_green
if color.is_red:
print 'Is red!'The enum item can be used whenever the value is needed:
assert u'Currrent color is {c} ({c.display})'.format(c=color) ==\
u'Currrent color is #f00 (Vermelho)'Usage with the custom Django fields:
from django.db import models
from choicesenum.django.fields import EnumCharField
class ColorModel(models.Model):
color = EnumCharField(
max_length=100,
enum=Colors,
default=Colors.GREEN,
)
instance = ColorModel()
assert instance.color == Colors.GREEN
assert instance.color.is_green is True
assert instance.color.value == Colors.GREEN.value == '#0f0'
assert instance.color.display == Colors.GREEN.display
instance.color = '#f00'
assert instance.color == '#f00'
assert instance.color.value == '#f00'
assert instance.color.display == 'Vermelho'Is guaranteed that the field value is always a ChoicesEnum item. Pay
attention that the field will only accept valid values for the Enum in use,
so if your field allow null, your enum should also:
from django.db import models
from choicesenum import ChoicesEnum
from choicesenum.django.fields import EnumIntegerField
class UserStatus(ChoicesEnum):
UNDEFINED = None
PENDING = 1
ACTIVE = 2
INACTIVE = 3
DELETED = 4
class User(models.Model):
status = EnumIntegerField(enum=UserStatus, null=True, )
instance = User()
assert instance.status.is_undefined is True
assert instance.status.value is None
assert instance.status == UserStatus.UNDEFINED
assert instance.status.display == 'Undefined'
# again...
instance.status = None
assert instance.status.is_undefined is TrueUsage with Graphene Enums:
UserStatusEnum = graphene.Enum.from_enum(UserStatus)