Skip to main content

Real Python Enums for Django.

Project description

This package lets you use real Python (PEP435-style) enums with Django.

https://travis-ci.org/druids/django-choice-enumfields.svg?branch=master

Installation

  1. pip install skip-django-choice-enumfields

Included Tools

EnumField, NumEnumField

from enumfields import EnumField
from enumfields import ChoiceEnum  # Uses Ethan Furman's "enum34" backport

class Color(ChoiceEnum):
    RED = 'r'
    GREEN = 'g'
    BLUE = 'b'

class MyModel(models.Model):

    color = EnumField(Color, max_length=1)

Elsewhere:

m = MyModel.objects.filter(color=Color.RED)

NumEnumField works identically, but the underlying storage mechanism is an IntegerField instead of a CharField.

EnumSubField, NumEnumSubField

from enumfields import EnumField, EnumSubField
from enumfields import ChoiceEnum

class Color(ChoiceEnum):
    RED = 'r'
    GREEN = 'g'
    BLUE = 'b'

class ColorType(ChoiceEnum):
    LIGHT = Choice('l', 'light', parents=(Color.RED, Color.BLUE))
    DARK = Choice('d', 'dark', parents=(Color.RED, Color.GREEN))
    TRANSPARENT = Choice('t', 'transparent', parents=(Color.GREEN))

class MyModel(models.Model):

    color = EnumField(Color, max_length=1)
    color_type = EnumSubField('color', ColorType, max_length=1)

MyModel(color=Color.RED, color_type=ColorType.LIGHT).full_clean()  # OK
MyModel(color=Color.RED, color_type=ColorType.TRANSPARENT).full_clean()  # Raise ValidationError

EnumSubField automatically validates if parents requirement is satisfied.

With EnumSubField, EnumField, NumEnumSubField and NumEnumField comes validation of initial and allowed transitions between choices out of the box.

from enumfields import EnumField
from enumfields import Choice, ChoiceEnum

class StateFlow(ChoiceEnum):
    START = Choice('s', 'start', next={'PROCESSING'})
    PROCESSING = Choice('p', 'processing', next={'END'}, initial=False)
    END = Choice('e', 'end', next=set(), initial=False)

class MyModel(models.Model):

    state = EnumField(StateFlow, max_length=1)

MyModel(state=StateFlow.START).full_clean()  # OK

# Raise ValidationError because PROCESSING is not in initial states
MyModel(state=StateFlow.PROCESSING).full_clean()

model = MyModel.objects.create(StateFlow.START)
model.state = StateFlow.END
# Raise ValidationError because END is not next state after START
model.full_clean()

model.state = StateFlow.PROCESSING
model.full_clean()  # OK

Usage in Forms

Call the formfield method to use an EnumField directly in a Form.

class MyForm(forms.Form):

    color = EnumField(Color, max_length=1).formfield()

ChoiceEnum

Normally, you just use normal PEP435-style enums, however, django-choice-enumfields also encludes its own version of ChoiceEnum with a few extra bells and whistles. Namely, the smart definition of labels which are used, for example, in admin dropdowns. By default, it will create labels by title-casing your constant names. You can provide custom labels with using Choice to define enum item.

from enumfields import EnumField, ChoiceEnum, Choice  # Our own Enum class

class Color(ChoiceEnum):
    RED = Choice('r', 'A custom label')
    GREEN = 'g'
    BLUE = 'b'

class MyModel(models.Model):
    color = EnumField(Color, max_length=1)

assert Color.GREEN.label == 'Green'
assert Color.RED.label == 'A custom label'

EnumFieldListFilter

enumfields.admin.EnumFieldListFilter is provided to allow using enums in list_filter.

from enumfields.admin import EnumFieldListFilter

class MyModelAdmin(admin.ModelAdmin):
  list_filter = [('color', EnumFieldListFilter)]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

skip-django-choice-enumfields-1.1.3.2.tar.gz (11.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

skip_django_choice_enumfields-1.1.3.2-py2.py3-none-any.whl (11.2 kB view details)

Uploaded Python 2Python 3

File details

Details for the file skip-django-choice-enumfields-1.1.3.2.tar.gz.

File metadata

File hashes

Hashes for skip-django-choice-enumfields-1.1.3.2.tar.gz
Algorithm Hash digest
SHA256 a5a69a7e930f5d60eb634b9dae980b1030bdd70b38edfeb8f4290cc6129b434b
MD5 8ae04ca9d16240a0ceb43d71fe278227
BLAKE2b-256 6be5dbc4638e4604410a6a130b55545fbc293294b9cfaadf58567644670836fb

See more details on using hashes here.

File details

Details for the file skip_django_choice_enumfields-1.1.3.2-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for skip_django_choice_enumfields-1.1.3.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 5398239fcfed2e39d108033e542e8ea713fc1d7be49a4463fc9c07dbf6ab6b51
MD5 9ba20257a86b98f3070266e04d4c9b7d
BLAKE2b-256 8ccb2cffaa97a132e531d10e3002e082a5fec794e2e7030126791caeb0f20b82

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page