{ "info": { "author": "Vasil Slavov", "author_email": "vasil.slavov@hacksoft.io", "bugtrack_url": null, "classifiers": [ "Framework :: Django", "Framework :: Django :: 1.11", "Framework :: Django :: 2.1", "Framework :: Django :: 2.2", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Software Development :: Libraries" ], "description": "\n# django-enum-choices\n\nA custom Django choice field to use with [Python enums.](https://docs.python.org/3/library/enum.html)\n\n[![PyPI version](https://badge.fury.io/py/django-enum-choices.svg)](https://badge.fury.io/py/django-enum-choices)\n\n## Table of Contents\n\n- [django-enum-choices](#django-enum-choices)\n - [Table of Contents](#table-of-contents)\n - [Installation](#installation)\n - [Basic Usage](#basic-usage)\n - [Choice builders](#choice-builders)\n - [Usage inside the admin panel](#usage-in-the-admin-panel)\n - [Usage with forms](#usage-with-forms)\n - [Usage with `django.forms.ModelForm`](#usage-with-djangoformsmodelform)\n - [Usage with `django.forms.Form`](#usage-with-djangoformsform)\n - [Usage with `django-filter`](#usage-with-django-filter)\n - [By using a `Meta` inner class and inheriting from `EnumChoiceFilterMixin`](#by-using-a-meta-inner-class-and-inheriting-from-enumchoicefiltermixin)\n - [By declaring the field explicitly on the `FilterSet`](#by-declaring-the-field-explicitly-on-the-filterset)\n - [Postgres ArrayField Usage](#postgres-arrayfield-usage)\n - [Usage with Django Rest Framework](#usage-with-django-rest-framework)\n - [Using `serializers.ModelSerializer` with `EnumChoiceModelSerializerMixin`](#using-serializersmodelserializer-with-enumchoicemodelserializermixin)\n - [Using `serializers.ModelSerializer` without `EnumChoiceModelSerializerMixin`](#using-serializersmodelserializer-without-enumchoicemodelserializermixin)\n - [Using a subclass of `serializers.Serializer`](#using-a-subclass-of-serializersserializer)\n - [Serializing PostgreSQL ArrayField](#serializing-postgresql-arrayfield)\n - [Implementation details](#implementation-details)\n - [Using Python's `enum.auto`](#using-pythons-enumauto)\n - [Development](#development)\n\n## Installation\n\n```bash\npip install django-enum-choices\n```\n\n## Basic Usage\n\n```python\nfrom enum import Enum\n\nfrom django.db import models\n\nfrom django_enum_choices.fields import EnumChoiceField\n\n\nclass MyEnum(Enum):\n A = 'a'\n B = 'b'\n\n\nclass MyModel(models.Model):\n enumerated_field = EnumChoiceField(MyEnum)\n```\n\n**Model creation**\n\n```python\ninstance = MyModel.objects.create(enumerated_field=MyEnum.A)\n```\n\n**Changing enum values**\n\n```python\ninstance.enumerated_field = MyEnum.B\ninstance.save()\n```\n\n**Filtering**\n\n```python\nMyModel.objects.filter(enumerated_field=MyEnum.A)\n```\n\n## Choice builders\n\n`EnumChoiceField` extends `CharField` and generates choices internally. Each choice is generated using something, called a `choice_builder`.\n\nA choice builder function looks like that:\n\n```python\ndef choice_builder(enum: Enum) -> Tuple[str, str]:\n # Some implementation\n```\n\nIf a `choice_builder` argument is passed to a model's `EnumChoiceField`, `django_enum_choices` will use it to generate the choices.\nThe `choice_builder` must be a callable that accepts an enumeration choice and returns a tuple,\ncontaining the value to be saved and the readable value.\n\nBy default `django_enum_choices` uses one of the four choice builders defined in `django_enum_choices.choice_builders`, named `value_value`.\n\nIt returns a tuple containing the enumeration's value twice:\n\n```python\nfrom django_enum_choices.choice_builders import value_value\n\nclass MyEnum(Enum):\n A = 'a'\n B = 'b'\n\nprint(value_value(MyEnum.A)) # ('a', 'a')\n```\n\nYou can use one of the four default ones that fits your needs:\n\n* `value_value`\n* `attribute_value`\n* `value_attribute`\n* `attribute_attribute`\n\nFor example:\n\n```python\nfrom django_enum_choices.choice_builders import attribute_value\n\nclass MyEnum(Enum):\n A = 'a'\n B = 'b'\n\nclass CustomReadableValueEnumModel(models.Model):\n enumerated_field = EnumChoiceField(\n MyEnum,\n choice_builder=attribute_value\n )\n```\n\nThe resulting choices for `enumerated_field` will be `(('A', 'a'), ('B', 'b'))`\n\nYou can also define your own choice builder:\n\n```python\nclass MyEnum(Enum):\n A = 'a'\n B = 'b'\n\ndef choice_builder(choice: Enum) -> Tuple[str, str]:\n return choice.value, choice.value.upper() + choice.value\n\nclass CustomReadableValueEnumModel(models.Model):\n enumerated_field = EnumChoiceField(\n MyEnum,\n choice_builder=choice_builder\n )\n```\n\nWhich will result in the following choices `(('a', 'Aa'), ('b', 'Bb'))`\n\nThe values in the returned from `choice_builder` tuple will be cast to strings before being used.\n\n\n## Usage in the admin panel\n\nModel fields, defined as `EnumChoiceField` can be used with almost all of the admin panel's\nstandard functionallities.\n\nOne exception from this their usage in `list_filter`.\n\nIf you need an `EnumChoiceField` inside a `ModelAdmin`'s `list_filter`, you can use the following\noptions:\n\n* Define the entry insite the list filter as a tuple, containing the field's name and `django_enum_choices.admin.EnumChoiceListFilter`\n\n```python\nfrom django.contrib import admin\n\nfrom django_enum_choices.admin import EnumChoiceListFilter\n\nfrom .models import MyModel\n\n@admin.register(MyModel)\nclass MyModelAdmin(admin.ModelAdmin):\n list_filter = [('enumerated_field', EnumChoiceListFilter)]\n```\n\n* Set `DJANGO_ENUM_CHOICES_REGISTER_LIST_FILTER` inside your settings to `True`, which will automatically set the `EnumChoiceListFilter` class to all\n`list_filter` fields that are instances of `EnumChoiceField`. This way, they can be declared directly in the `list_filter` iterable:\n\n```python\nfrom django.contrib import admin\n\nfrom .models import MyModel\n\n@admin.register(MyModel)\nclass MyModelAdmin(admin.ModelAdmin):\n list_filter = ('enumerated_field', )\n```\n\n\n## Usage with forms\n\nThere are 2 rules of thumb:\n\n1. If you use a `ModelForm`, everything will be taken care of automatically.\n2. If you use a `Form`, you need to take into account what `Enum` and `choice_builder` you are using.\n\n\n### Usage with `django.forms.ModelForm`\n\n```python\nfrom .models import MyModel\n\nclass ModelEnumForm(forms.ModelForm):\n class Meta:\n model = MyModel\n fields = ['enumerated_field']\n\nform = ModelEnumForm({\n 'enumerated_field': 'a'\n})\n\nform.is_valid()\n\nprint(form.save(commit=True)) # \n```\n\n### Usage with `django.forms.Form`\n\nIf you are using the default `value_value` choice builder, you can just do that:\n\n```python\nfrom django_enum_choices.forms import EnumChoiceField\n\nfrom .enumerations import MyEnum\n\nclass StandardEnumForm(forms.Form):\n enumerated_field = EnumChoiceField(MyEnum)\n\nform = StandardEnumForm({\n 'enumerated_field': 'a'\n})\nform.is_valid()\n\nprint(form.cleaned_data) # {'enumerated_field': }\n```\n\nIf you are passing a different choice builder, you have to also pass it to the form field:\n\n```python\nfrom .enumerations import MyEnum\n\ndef custom_choice_builder(choice):\n return 'Custom_' + choice.value, choice.value\n\nclass CustomChoiceBuilderEnumForm(forms.Form):\n enumerated_field = EnumChoiceField(\n MyEnum,\n choice_builder=custom_choice_builder\n )\n\nform = CustomChoiceBuilderEnumForm({\n 'enumerated_field': 'Custom_a'\n})\n\nform.is_valid()\n\nprint(form.cleaned_data) # {'enumerated_field': }\n```\n\n## Usage with `django-filter`\n\nAs with forms, there are 2 general rules of thumb:\n\n1. If you have declared an `EnumChoiceField` in the `Meta.fields` for a given `Meta.model`, you need to inherit `EnumChoiceFilterMixin` in your filter class & everything will be taken care of automatically.\n2. If you are declaring an explicit field, without a model, you need to specify the `Enum` class & the `choice_builder`, if a custom one is used.\n\n### By using a `Meta` inner class and inheriting from `EnumChoiceFilterMixin`\n\n```python\nimport django_filters as filters\n\nfrom django_enum_choices.filters import EnumChoiceFilterMixin\n\nclass ImplicitFilterSet(EnumChoiceFilterSetMixin, filters.FilterSet):\n class Meta:\n model = MyModel\n fields = ['enumerated_field']\n\nfilters = {\n 'enumerated_field': 'a'\n}\nfilterset = ImplicitFilterSet(filters)\n\nprint(filterset.qs.values_list('enumerated_field', flat=True))\n# , , ]>\n```\n\nThe `choice_builder` argument can be passed to `django_enum_choices.filters.EnumChoiceFilter` as well when using the field explicitly. When using `EnumChoiceFilterSetMixin`, the `choice_builder` is determined from the model field, for the fields defined inside the `Meta` inner class.\n\n```python\nimport django_filters as filters\n\nfrom django_enum_choices.filters import EnumChoiceFilter\n\ndef custom_choice_builder(choice):\n return 'Custom_' + choice.value, choice.value\n\nclass ExplicitCustomChoiceBuilderFilterSet(filters.FilterSet):\n enumerated_field = EnumChoiceFilter(\n MyEnum,\n choice_builder=custom_choice_builder\n )\n\nfilters = {\n 'enumerated_field': 'Custom_a'\n}\nfilterset = ExplicitCustomChoiceBuilderFilterSet(filters, MyModel.objects.all())\n\nprint(filterset.qs.values_list('enumerated_field', flat=True)) # , , ]>\n```\n\n\n### By declaring the field explicitly on the `FilterSet`\n\n```python\nimport django_filters as filters\n\nfrom django_enum_choices.filters import EnumChoiceFilter\n\nclass ExplicitFilterSet(filters.FilterSet):\n enumerated_field = EnumChoiceFilter(MyEnum)\n\n\nfilters = {\n 'enumerated_field': 'a'\n}\nfilterset = ExplicitFilterSet(filters, MyModel.objects.all())\n\nprint(filterset.qs.values_list('enumerated_field', flat=True)) # , , ]>\n```\n\n## Postgres ArrayField Usage\n\nYou can use `EnumChoiceField` as a child field of an Postgres `ArrayField`.\n\n```python\nfrom django.db import models\nfrom django.contrib.postgres.fields import ArrayField\n\nfrom django_enum_choices.fields import EnumChoiceField\n\nfrom enum import Enum\n\nclass MyEnum(Enum):\n A = 'a'\n B = 'b'\n\nclass MyModelMultiple(models.Model):\n enumerated_field = ArrayField(\n base_field=EnumChoiceField(MyEnum)\n )\n```\n\n**Model Creation**\n\n```python\ninstance = MyModelMultiple.objects.create(enumerated_field=[MyEnum.A, MyEnum.B])\n```\n\n**Changing enum values**\n\n```python\ninstance.enumerated_field = [MyEnum.B]\ninstance.save()\n```\n\n## Usage with Django Rest Framework\n\nAs with forms & filters, there are 2 general rules of thumb:\n\n1. If you are using a `ModelSerializer` and you inherit `EnumChoiceModelSerializerMixin`, everything will be taken care of automatically.\n2. If you are using a `Serializer`, you need to take the `Enum` class & `choice_builder` into acount.\n\n### Using `serializers.ModelSerializer` with `EnumChoiceModelSerializerMixin`\n\n```python\nfrom rest_framework import serializers\n\nfrom django_enum_choices.serializers import EnumChoiceModelSerializerMixin\n\nclass ImplicitMyModelSerializer(\n EnumChoiceModelSerializerMixin,\n serializers.ModelSerializer\n):\n class Meta:\n model = MyModel\n fields = ('enumerated_field', )\n```\n\nBy default `ModelSerializer.build_standard_field` coerces any field that has a model field with choices to `ChoiceField` which returns the value directly.\n\nSince enum values resemble `EnumClass.ENUM_INSTANCE` they won't be able to be encoded by the `JSONEncoder` when being passed to a `Response`.\n\nThat's why we need the mixin.\n\nWhen using the `EnumChoiceModelSerializerMixin` with DRF's `serializers.ModelSerializer`, the `choice_builder` is automatically passed from the model field to the serializer field.\n\n### Using `serializers.ModelSerializer` without `EnumChoiceModelSerializerMixin`\n\n```python\nfrom rest_framework import serializers\n\nfrom django_enum_choices.serializers import EnumChoiceField\n\nclass MyModelSerializer(serializers.ModelSerializer):\n enumerated_field = EnumChoiceField(MyEnum)\n\n class Meta:\n model = MyModel\n fields = ('enumerated_field', )\n\n# Serialization:\ninstance = MyModel.objects.create(enumerated_field=MyEnum.A)\nserializer = MyModelSerializer(instance)\ndata = serializer.data # {'enumerated_field': 'a'}\n\n# Saving:\nserializer = MyModelSerializer(data={\n 'enumerated_field': 'a'\n})\nserializer.is_valid()\nserializer.save()\n```\n\nIf you are using a custom `choice_builder`, you need to pass that too.\n\n```python\ndef custom_choice_builder(choice):\n return 'Custom_' + choice.value, choice.value\n\nclass CustomChoiceBuilderSerializer(serializers.Serializer):\n enumerted_field = EnumChoiceField(\n MyEnum,\n choice_builder=custom_choice_builder\n )\n\nserializer = CustomChoiceBuilderSerializer({\n 'enumerated_field': MyEnum.A\n})\n\ndata = serializer.data # {'enumerated_field': 'Custom_a'}\n```\n\n### Using a subclass of `serializers.Serializer`\n\n```python\nfrom rest_framework import serializers\n\nfrom django_enum_choices.serializers import EnumChoiceField\n\nclass MySerializer(serializers.Serializer):\n enumerated_field = EnumChoiceField(MyEnum)\n\n# Serialization:\nserializer = MySerializer({\n 'enumerated_field': MyEnum.A\n})\ndata = serializer.data # {'enumerated_field': 'a'}\n\n# Deserialization:\nserializer = MySerializer(data={\n 'enumerated_field': 'a'\n})\nserializer.is_valid()\ndata = serializer.validated_data # OrderedDict([('enumerated_field', )])\n```\n\nIf you are using a custom `choice_builder`, you need to pass that too.\n\n### Serializing PostgreSQL ArrayField\n\n`django-enum-choices` exposes a `MultipleEnumChoiceField` that can be used for serializing arrays of enumerations.\n\n**Using a subclass of `serializers.Serializer`**\n\n```python\nfrom rest_framework import serializers\n\nfrom django_enum_choices.serializers import MultipleEnumChoiceField\n\nclass MultipleMySerializer(serializers.Serializer):\n enumerated_field = MultipleEnumChoiceField(MyEnum)\n\n# Serialization:\nserializer = MultipleMySerializer({\n 'enumerated_field': [MyEnum.A, MyEnum.B]\n})\ndata = serializer.data # {'enumerated_field': ['a', 'b']}\n\n# Deserialization:\nserializer = MultipleMySerializer(data={\n 'enumerated_field': ['a', 'b']\n})\nserializer.is_valid()\ndata = serializer.validated_data # OrderedDict([('enumerated_field', [, ])])\n```\n\n**Using a subclass of `serializers.ModelSerializer`**\n\n```python\nclass ImplicitMultipleMyModelSerializer(\n EnumChoiceModelSerializerMixin,\n serializers.ModelSerializer\n):\n class Meta:\n model = MyModelMultiple\n fields = ('enumerated_field', )\n\n# Serialization:\ninstance = MyModelMultiple.objects.create(enumerated_field=[MyEnum.A, MyEnum.B])\nserializer = ImplicitMultipleMyModelSerializer(instance)\ndata = serializer.data # {'enumerated_field': ['a', 'b']}\n\n# Saving:\nserializer = ImplicitMultipleMyModelSerializer(data={\n 'enumerated_field': ['a', 'b']\n})\nserializer.is_valid()\nserializer.save()\n```\n\nThe `EnumChoiceModelSerializerMixin` does not need to be used if `enumerated_field` is defined on the serializer class explicitly.\n\n## Implementation details\n\n* `EnumChoiceField` is a subclass of `CharField`.\n* Only subclasses of `Enum` are valid arguments for `EnumChoiceField`.\n* `max_length`, if passed, is ignored. `max_length` is automatically calculated from the longest choice.\n* `choices` are generated using a special `choice_builder` function, which accepts an enumeration and returns a tuple of 2 items.\n * Four choice builder functions are defined inside `django_enum_choices.choice_builders`\n * By default the `value_value` choice builder is used. It produces the choices from the values in the enumeration class, like `(enumeration.value, enumeration.value)`\n * `choice_builder` can be overriden by passing a callable to the `choice_builder` keyword argument of `EnumChoiceField`.\n * All values returned from the choice builder **will be cast to strings** when generating choices.\n\nFor example, lets have the following case:\n\n```python\nclass Value:\n def __init__(self, value):\n self.value = value\n\n def __str__(self):\n return self.value\n\n\nclass CustomObjectEnum(Enum):\n A = Value(1)\n B = Value('B')\n\n\t# The default choice builder `value_value` is being used\n\nclass SomeModel(models.Model):\n enumerated_field = EnumChoiceField(CustomObjectEnum)\n```\n\nWe'll have the following:\n\n* `SomeModel.enumerated_field.choices == (('1', '1'), ('B', 'B'))`\n* `SomeModel.enumerated_field.max_length == 3`\n\n## Using Python's `enum.auto`\n\n`enum.auto` can be used for shorthand enumeration definitions:\n\n```python\nfrom enum import Enum, auto\n\nclass AutoEnum(Enum):\n A = auto() # 1\n B = auto() # 2\n\nclass SomeModel(models.Model):\n enumerated_field = EnumChoiceField(Enum)\n```\n\nThis will result in the following:\n* `SomeModel.enumerated_field.choices == (('1', '1'), ('2', '2'))`\n\n**Overridinng `auto` behaviour**\nCustom values for enumerations, created by `auto`, can be defined by\nsubclassing an `Enum` that defines `_generate_next_value_`:\n\n```python\nclass CustomAutoEnumValueGenerator(Enum):\n def _generate_next_value_(name, start, count, last_values):\n return {\n 'A': 'foo',\n 'B': 'bar'\n }[name]\n\n\nclass CustomAutoEnum(CustomAutoEnumValueGenerator):\n A = auto()\n B = auto()\n```\n\nThe above will assign the values mapped in the dictionary as values to attributes in `CustomAutoEnum`.\n\n## Development\n\n**Prerequisites**\n* SQLite3\n* PostgreSQL server\n* Python >= 3.5 virtual environment\n\n```bash\ngit clone https://github.com/HackSoftware/django-enum-choices.git\ncd django_enum_choices\npip install -e .[dev]\n```\n\nLinting and running the tests:\n```bash\ntox\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/HackSoftware/django-enum-choices", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-enum-choices", "package_url": "https://pypi.org/project/django-enum-choices/", "platform": "", "project_url": "https://pypi.org/project/django-enum-choices/", "project_urls": { "Homepage": "https://github.com/HackSoftware/django-enum-choices" }, "release_url": "https://pypi.org/project/django-enum-choices/2.1.1/", "requires_dist": [ "Django (>=1.11)", "Django (==2.2.3) ; extra == 'dev'", "djangorestframework (==3.9.4) ; extra == 'dev'", "psycopg2 (==2.8.3) ; extra == 'dev'", "flake8 (==3.7.7) ; extra == 'dev'", "pytest (==4.6.3) ; extra == 'dev'", "pytest-django (==3.5.0) ; extra == 'dev'", "pytest-pythonpath (==0.7.3) ; extra == 'dev'", "django-environ (==0.4.5) ; extra == 'dev'", "tox (==3.13.2) ; extra == 'dev'", "bumpversion (==0.5.3) ; extra == 'dev'", "tox-pyenv (==1.1.0) ; extra == 'dev'", "django-filter (==2.2.0) ; extra == 'dev'" ], "requires_python": ">=3.5.0", "summary": "A custom Django field able to use subclasses of Python's internal `Enum` class as choices", "version": "2.1.1" }, "last_serial": 5770122, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "fdc13ffefa1a234b656f11d9d981c1cc", "sha256": "f7db5a6af2a806358d9cb469ab68da11f3f4af2ad8b66dc7cd7363c0beacf34c" }, "downloads": -1, "filename": "django_enum_choices-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fdc13ffefa1a234b656f11d9d981c1cc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 8554, "upload_time": "2019-06-20T14:15:48", "url": "https://files.pythonhosted.org/packages/8f/74/79a469c77bfe0a5a6fa22aacaaacc7d28460589ceebcb6312cc66d22d0ee/django_enum_choices-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c8188e4244f5bff9d575026dd231137b", "sha256": "4990dc161e33b38bc51199a4315578cc9c4deaeacea251dd14db21b87a416776" }, "downloads": -1, "filename": "django_enum_choices-0.0.1.tar.gz", "has_sig": false, "md5_digest": "c8188e4244f5bff9d575026dd231137b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6296, "upload_time": "2019-06-20T14:15:51", "url": "https://files.pythonhosted.org/packages/07/b6/fe879282e4ad8cd75af9c49cf50975e5f2bd0ab41dfe4c55376ec5d18ac9/django_enum_choices-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "f9ac9414fd857e969d1377bc13646ca5", "sha256": "7ec4d4d2cbfd9191781196ac9dab85d7b63f47fb73a001ae74000b75e2d6905d" }, "downloads": -1, "filename": "django_enum_choices-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f9ac9414fd857e969d1377bc13646ca5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 8153, "upload_time": "2019-06-21T10:07:57", "url": "https://files.pythonhosted.org/packages/ed/f9/2deca2282616e45dd7c595c1c31b68f293b5a9f1180b55377ffa4f2e7595/django_enum_choices-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dbfa761f0927c70e82411eaae1ebe449", "sha256": "4883cff62a7ef9f9be25a1bd143ef28726582137ab74519adac7749ccf04b812" }, "downloads": -1, "filename": "django_enum_choices-0.0.2.tar.gz", "has_sig": false, "md5_digest": "dbfa761f0927c70e82411eaae1ebe449", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 5754, "upload_time": "2019-06-21T10:07:58", "url": "https://files.pythonhosted.org/packages/8b/6b/7c423a6fae3edd5beb95777ae62c21c5b2e986e44395ba93c577081adc6b/django_enum_choices-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "dd1f451161940a6bbb2bc4e4429ed099", "sha256": "d4cb4373a673144c50c8964abb7e9a38261aca0a5b1680fa07f99f286b3cf028" }, "downloads": -1, "filename": "django_enum_choices-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dd1f451161940a6bbb2bc4e4429ed099", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 8790, "upload_time": "2019-06-21T14:35:21", "url": "https://files.pythonhosted.org/packages/7f/6a/19f232608f4b7913281bee74a70e7314553a6b98cc918eab378b0de0dd72/django_enum_choices-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7303a8786c11937b6d91a06287fa965b", "sha256": "d064297e17239282574e6e354bf45387d9863fd2c274463318feb802f7619142" }, "downloads": -1, "filename": "django_enum_choices-0.0.3.tar.gz", "has_sig": false, "md5_digest": "7303a8786c11937b6d91a06287fa965b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6315, "upload_time": "2019-06-21T14:35:23", "url": "https://files.pythonhosted.org/packages/82/16/fd8af58761bff2f904ae658efe4dfe466c6f3566d1cf5a38601fe7729c65/django_enum_choices-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "9b9a27561a5968d20efe924b0c38934c", "sha256": "f82bcc5165cf2c8478f0b4bd22d7aca8588f5cacb47b436b149b798c4fe0a0a4" }, "downloads": -1, "filename": "django_enum_choices-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9b9a27561a5968d20efe924b0c38934c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 9839, "upload_time": "2019-06-24T13:55:40", "url": "https://files.pythonhosted.org/packages/0a/8d/da697c096c5cad153de6acbfe3f4bb40a27b237593f36909ca4a58dc07fb/django_enum_choices-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6220024311ff51d26ad2464acd58a0ae", "sha256": "ee0d1ad3b1930d3d89178b37fba6a1a69817d381734607834dc907adf8f3a87c" }, "downloads": -1, "filename": "django_enum_choices-0.0.4.tar.gz", "has_sig": false, "md5_digest": "6220024311ff51d26ad2464acd58a0ae", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 7242, "upload_time": "2019-06-24T13:55:41", "url": "https://files.pythonhosted.org/packages/66/70/ac7fd785251e09edee72ef88ed3ab143bb3e8577dc1f44ceb0e7cd778512/django_enum_choices-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "dfa9d3e6040cc5472865a89447415aaa", "sha256": "cf747a72881d3e617f225ddf5b080e0a26eece70cf3bceb8ec66d99cadff540f" }, "downloads": -1, "filename": "django_enum_choices-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dfa9d3e6040cc5472865a89447415aaa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 14495, "upload_time": "2019-06-25T12:49:59", "url": "https://files.pythonhosted.org/packages/fc/9f/67b24ccda726d4a09f056d5f512ab70e94c7d6396c897193cf64fbff0f41/django_enum_choices-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d24356f48629383a8a74e55e32ca38a3", "sha256": "6c82083d3d7fb0fbd1d74261fe4c7ea12c7c6e0566de2b8e02ab6864bb08500a" }, "downloads": -1, "filename": "django_enum_choices-0.0.5.tar.gz", "has_sig": false, "md5_digest": "d24356f48629383a8a74e55e32ca38a3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 7869, "upload_time": "2019-06-25T12:50:01", "url": "https://files.pythonhosted.org/packages/5d/97/7181d24f9611095cda77980011f614481af5631907411887b7229df262a8/django_enum_choices-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "40a21a02f3a62947e65bf17da42488c7", "sha256": "91decfa124ae00c24086f423079768d5f78d6eaa454ca2b41f5f09839654172e" }, "downloads": -1, "filename": "django_enum_choices-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "40a21a02f3a62947e65bf17da42488c7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 15083, "upload_time": "2019-07-02T11:13:32", "url": "https://files.pythonhosted.org/packages/5a/a0/37caf19651f4b6c5e6845781c7c66a16337985ec275d188333e36190c6c0/django_enum_choices-0.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "81eb05dc8d3673ce06ead0af07292f0b", "sha256": "31c3b940cdcf25d330b3eea94d2443f28cb7d5325defa719004453754b423b08" }, "downloads": -1, "filename": "django_enum_choices-0.0.6.tar.gz", "has_sig": false, "md5_digest": "81eb05dc8d3673ce06ead0af07292f0b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 8581, "upload_time": "2019-07-02T11:13:33", "url": "https://files.pythonhosted.org/packages/9a/75/9ce5834c3983d34b470d0395f22f98af76dab7b4cc70373aca695b8d8ac6/django_enum_choices-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "8a2c215f673ea241fa330d4097701581", "sha256": "848543a5105a0844e55c17af19b3c65e693f781f3279fe44f2edba848e0911f7" }, "downloads": -1, "filename": "django_enum_choices-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8a2c215f673ea241fa330d4097701581", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 16252, "upload_time": "2019-07-03T14:05:12", "url": "https://files.pythonhosted.org/packages/34/22/4a7b8cd98b7f39a1d95e0fd3e6f77db839c97543e0cac20e515f41b3e1fc/django_enum_choices-0.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e41e66e09cc392dd185d664417728169", "sha256": "65ff7f952203e24741ab3341707722850c503734bf5e1d0becdf4a221b1210d7" }, "downloads": -1, "filename": "django_enum_choices-0.0.7.tar.gz", "has_sig": false, "md5_digest": "e41e66e09cc392dd185d664417728169", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 9737, "upload_time": "2019-07-03T14:05:14", "url": "https://files.pythonhosted.org/packages/23/96/f195b704562fc63fa78d9c7e8ba8f359c6aaeae0cc2059dabcecaa10e8de/django_enum_choices-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "ca62ff8f617899f32a0fb451312786c6", "sha256": "1bffd1a423fbe908b04c780436b39559c2882a1a543fe56b76e7b7b9cdebd087" }, "downloads": -1, "filename": "django_enum_choices-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ca62ff8f617899f32a0fb451312786c6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5.0", "size": 16396, "upload_time": "2019-07-04T09:08:00", "url": "https://files.pythonhosted.org/packages/46/4d/c786407e1b90ef1fb65d7b18569c0db879128abaaf79e88af8c0a7dc16b0/django_enum_choices-0.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d41ce2c0b547e5f6951a0879b92e120c", "sha256": "a45196ecd6d39453c6c07922f8a3277f9b90656bec87e4b73199957d58f98fb6" }, "downloads": -1, "filename": "django_enum_choices-0.0.8.tar.gz", "has_sig": false, "md5_digest": "d41ce2c0b547e5f6951a0879b92e120c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 9920, "upload_time": "2019-07-04T09:08:01", "url": "https://files.pythonhosted.org/packages/54/1f/14a4f4ab761124c0b11af5cb44a418b7d3cf52e9cfa34022154e029587ae/django_enum_choices-0.0.8.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "2dc1c797ec12f0d1202995d205ed51d1", "sha256": "8c6908606cb4118b5bb31d94a9bb30b611ca1fd53e0aabe9f3e3e7525ce929fa" }, "downloads": -1, "filename": "django_enum_choices-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2dc1c797ec12f0d1202995d205ed51d1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5.0", "size": 17460, "upload_time": "2019-07-08T08:30:11", "url": "https://files.pythonhosted.org/packages/1a/10/c1b7e05564d8dc1cba612c6bedba1f093e76fe546f53d4ec07bbe9423d1e/django_enum_choices-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "247af170b4933bd2f1d060bfe44a7728", "sha256": "04bc167ac3006b341c4e77b454b2d70efc68ad0bd8882d794e82833e578dc407" }, "downloads": -1, "filename": "django_enum_choices-1.0.0.tar.gz", "has_sig": false, "md5_digest": "247af170b4933bd2f1d060bfe44a7728", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 11575, "upload_time": "2019-07-08T08:30:13", "url": "https://files.pythonhosted.org/packages/d8/b8/1b6c8499f3baf310dc4e9c74626398edb4766eac40f7de95d7f7ceba0b94/django_enum_choices-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "9285ba009528c436f588415c301f73f5", "sha256": "75646ca3e332a7b742529cb793cedecba0a97e1f8c6285fa4f5075394a62f413" }, "downloads": -1, "filename": "django_enum_choices-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9285ba009528c436f588415c301f73f5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5.0", "size": 18303, "upload_time": "2019-07-09T15:46:13", "url": "https://files.pythonhosted.org/packages/b8/ce/5d71e671c0760ccf45f8133c78f682bf8ef87d1cf2cbe8bb4f616aad11c8/django_enum_choices-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d460977da268a65d32dec33b97234d23", "sha256": "4c0e19048c60509c2dd2e5adc684e3c0c678f55dbc9dcf1a525bb222ce313955" }, "downloads": -1, "filename": "django_enum_choices-1.0.1.tar.gz", "has_sig": false, "md5_digest": "d460977da268a65d32dec33b97234d23", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 12090, "upload_time": "2019-07-09T15:46:15", "url": "https://files.pythonhosted.org/packages/38/a5/f21d8c24a95eb8f194ee730c190b7f007fd3939aa8172a2db7483bdb24c9/django_enum_choices-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "a24ad7aa4aff72dc8f4241afd5620803", "sha256": "5634f51971a0f7640f87e725acc3bd8ada18ded47a4ca449acdb0e2c15bedb27" }, "downloads": -1, "filename": "django_enum_choices-1.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a24ad7aa4aff72dc8f4241afd5620803", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5.0", "size": 20242, "upload_time": "2019-07-11T12:36:04", "url": "https://files.pythonhosted.org/packages/2c/06/1a50d3557c94a88d9a6f85e92976d8f01ac3d019bc581a7c296dae5c00d4/django_enum_choices-1.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "23506dc0f2b403f6ecc9b2e99a0ea239", "sha256": "8496e4c4fc589d53ae82ad2fea15599a7b97c60bdd2304f8136a814d58743087" }, "downloads": -1, "filename": "django_enum_choices-1.0.2.tar.gz", "has_sig": false, "md5_digest": "23506dc0f2b403f6ecc9b2e99a0ea239", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 17057, "upload_time": "2019-07-11T12:36:06", "url": "https://files.pythonhosted.org/packages/82/dc/622efed0e0f9d75afcc2fc13c9b353357fffd6af385190f1016b2621d75d/django_enum_choices-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "4eb1dd1809d3abe742064a7f8ad46abc", "sha256": "3849f94f061e45641379a20f1946904ccc5b9bbc3c686da9e2a8d53145a2e201" }, "downloads": -1, "filename": "django_enum_choices-1.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4eb1dd1809d3abe742064a7f8ad46abc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5.0", "size": 20246, "upload_time": "2019-07-16T08:55:59", "url": "https://files.pythonhosted.org/packages/d7/7d/1713db956b83a2b9bd369383dae0ee2d3bb95c3c986f1d52e2b29bd019e3/django_enum_choices-1.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2bdf7091e4195e8cbc3e35c461d204ee", "sha256": "35f2aaf8a8a06a955912b5f73870c7c724e9a005ab4fcf93acf019d96f429af9" }, "downloads": -1, "filename": "django_enum_choices-1.0.3.tar.gz", "has_sig": false, "md5_digest": "2bdf7091e4195e8cbc3e35c461d204ee", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 17068, "upload_time": "2019-07-16T08:56:01", "url": "https://files.pythonhosted.org/packages/83/d4/432bc6496456f692b975b8b1d8edac1fdea2449b16f49278331359e28a45/django_enum_choices-1.0.3.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "0b116127d0b2353d4b0d230720518156", "sha256": "79ce1290cd4866699313b1e6cd6457cdc8cebc2907f18ec56048a60320b7ba80" }, "downloads": -1, "filename": "django_enum_choices-2.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0b116127d0b2353d4b0d230720518156", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5.0", "size": 27066, "upload_time": "2019-07-24T12:59:30", "url": "https://files.pythonhosted.org/packages/3f/7b/63e7b3d6ce336138b27b039bd4c9e1f01441947f37422c5bb91f67b4bb94/django_enum_choices-2.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1d38f0ec54b6cafcd5b40c9393c0787f", "sha256": "9bdd2abf4d9ba09372155e5f5c039e426921d749b1be3c73062749a8d5d5cee2" }, "downloads": -1, "filename": "django_enum_choices-2.0.0.tar.gz", "has_sig": false, "md5_digest": "1d38f0ec54b6cafcd5b40c9393c0787f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 22069, "upload_time": "2019-07-24T12:59:32", "url": "https://files.pythonhosted.org/packages/48/d7/b65ce4221d52c41ad770cbf5bdf08fcdfa6d64454646af4ac4a10d6a4ff5/django_enum_choices-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "b3de24db6a5f14a410b769d629d5b65a", "sha256": "8dcf0c356c7576a04ba55b69ebec6b2a7cddb1a37a2ee2ecf9b9c378d1d258d9" }, "downloads": -1, "filename": "django_enum_choices-2.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b3de24db6a5f14a410b769d629d5b65a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5.0", "size": 28317, "upload_time": "2019-08-05T09:10:08", "url": "https://files.pythonhosted.org/packages/91/47/f41a20975babf8b4d3cbc85d33b654317eb7062a53dfa2a8e91103e21861/django_enum_choices-2.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "472270221b67ffa7504ca42bb8d4798b", "sha256": "50bcee543e1694ad0f8f6ab34caa6437bfbf3158dfa293484372877381988e96" }, "downloads": -1, "filename": "django_enum_choices-2.0.1.tar.gz", "has_sig": false, "md5_digest": "472270221b67ffa7504ca42bb8d4798b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 23520, "upload_time": "2019-08-05T09:10:10", "url": "https://files.pythonhosted.org/packages/49/e2/762a14ac3e93c3dbfa0fef3251a03b59a2f46e692b8153de438476d5afb5/django_enum_choices-2.0.1.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "7ffc7a8cd1be408d7a520867d70eafe6", "sha256": "aa9f5e732ccb03254f08d91840e9495e03724c9caba8a5f763d59346d4754b27" }, "downloads": -1, "filename": "django_enum_choices-2.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7ffc7a8cd1be408d7a520867d70eafe6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5.0", "size": 31059, "upload_time": "2019-08-23T07:48:52", "url": "https://files.pythonhosted.org/packages/72/e3/bcecbcca9841a5705c6557add529d55b794a00b57188480a8da3da73b994/django_enum_choices-2.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "383954015ed8cff7fce6b1dfa4b1a377", "sha256": "7afb61a7592375345b0073925b6247e9df4da2e1be6d6708b5d83879bc2a9d89" }, "downloads": -1, "filename": "django_enum_choices-2.1.0.tar.gz", "has_sig": false, "md5_digest": "383954015ed8cff7fce6b1dfa4b1a377", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 25606, "upload_time": "2019-08-23T07:48:55", "url": "https://files.pythonhosted.org/packages/cb/ec/68085454c5aa924014adfccd858596af195777219f671e14239c0c8c7b9b/django_enum_choices-2.1.0.tar.gz" } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "138d899416837fbe3b149b2ca9bd4d61", "sha256": "4d04852ac879cb3b74490441d8f55e6d7d243b71c352f449b76186cacbe786d3" }, "downloads": -1, "filename": "django_enum_choices-2.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "138d899416837fbe3b149b2ca9bd4d61", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5.0", "size": 38271, "upload_time": "2019-09-02T10:32:41", "url": "https://files.pythonhosted.org/packages/58/6d/8ac5fe38fe66a4f87c7b161b951fc1b6e1be8fe689dd300e083cceed163e/django_enum_choices-2.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba0075b9ed9ed38fd34be0d28e76687e", "sha256": "01cf01188e409daa3e376c60b4c8e1eea89f1742bb49b45a7a50cf613baf9d40" }, "downloads": -1, "filename": "django_enum_choices-2.1.1.tar.gz", "has_sig": false, "md5_digest": "ba0075b9ed9ed38fd34be0d28e76687e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 29401, "upload_time": "2019-09-02T10:32:44", "url": "https://files.pythonhosted.org/packages/4c/7f/05396d1e4a4f44e89c39a97dcf1b331d54fe736bd2b30c1dcb8bea2cf4f3/django_enum_choices-2.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "138d899416837fbe3b149b2ca9bd4d61", "sha256": "4d04852ac879cb3b74490441d8f55e6d7d243b71c352f449b76186cacbe786d3" }, "downloads": -1, "filename": "django_enum_choices-2.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "138d899416837fbe3b149b2ca9bd4d61", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5.0", "size": 38271, "upload_time": "2019-09-02T10:32:41", "url": "https://files.pythonhosted.org/packages/58/6d/8ac5fe38fe66a4f87c7b161b951fc1b6e1be8fe689dd300e083cceed163e/django_enum_choices-2.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba0075b9ed9ed38fd34be0d28e76687e", "sha256": "01cf01188e409daa3e376c60b4c8e1eea89f1742bb49b45a7a50cf613baf9d40" }, "downloads": -1, "filename": "django_enum_choices-2.1.1.tar.gz", "has_sig": false, "md5_digest": "ba0075b9ed9ed38fd34be0d28e76687e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 29401, "upload_time": "2019-09-02T10:32:44", "url": "https://files.pythonhosted.org/packages/4c/7f/05396d1e4a4f44e89c39a97dcf1b331d54fe736bd2b30c1dcb8bea2cf4f3/django_enum_choices-2.1.1.tar.gz" } ] }