def Enum(field, enum, key_func=None): """ Enum is an adapter to another field: it will just change its display attribute. It uses a dictionary to associate a value to another. key_func is an optional function with prototype "def func(key)->key" which is called to transform key. """ display = field.createDisplay if key_func: def createDisplay(): try: key = key_func(field.value) return enum[key] except LookupError: return display() else: def createDisplay(): try: return enum[field.value] except LookupError: return display() field.createDisplay = createDisplay field.getEnum = lambda: enum return field