Repository URL to install this package:
|
Version:
0.0.1 ▾
|
dj-kaos-utils
/
choices.py
|
|---|
from collections import OrderedDict
from djchoices import DjangoChoices, ChoiceItem
from djchoices.choices import DjangoChoicesMeta, Labels, sentinel, StaticProp, ChoicesValidator, Attributes
class KDjangoChoicesMeta(DjangoChoicesMeta):
def __new__(mcs, name, bases, attrs):
fields = {}
labels = Labels()
values = OrderedDict()
attributes = OrderedDict()
choices = []
# Get all the fields from parent classes.
parents = [b for b in bases if isinstance(b, DjangoChoicesMeta)]
for kls in parents:
for field_name in kls._fields:
fields[field_name] = kls._fields[field_name]
# Get all the fields from this class.
for field_name in attrs:
val = attrs[field_name]
if isinstance(val, ChoiceItem):
fields[field_name] = val
fields = OrderedDict(sorted(fields.items(), key=lambda x: x[1].order))
for field_name in fields:
val = fields[field_name]
if isinstance(val, ChoiceItem):
if val.label is not None:
label = val.label
else:
# TODO: mark translatable by default?
label = mcs.name_clean.sub(" ", field_name)
val0 = field_name if val.value is sentinel else val.value
choices.append((val0, label))
attrs[field_name] = StaticProp(val0)
setattr(labels, field_name, label)
values[val0] = label
attributes[val0] = field_name
else:
choices.append((field_name, val.choices))
attrs["choices"] = StaticProp(tuple(choices))
attrs["labels"] = labels
attrs["values"] = values
attrs["_fields"] = fields
attrs["validator"] = ChoicesValidator(values)
attrs["attributes"] = Attributes(attributes, fields)
return super(DjangoChoicesMeta, mcs).__new__(mcs, name, bases, attrs)
class KDjangoChoices(DjangoChoices):
__metaclass__ = KDjangoChoicesMeta
def to_json(self):
return [{'value': key, 'label': value} for key, value in self.choices]