Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
dj-kaos-utils / choices.py
Size: Mime:
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]