|
1 | 1 | # -*- encoding: utf-8 -*- |
2 | | -import enum |
| 2 | +from enum import Enum, EnumMeta |
3 | 3 | import six |
4 | 4 |
|
5 | 5 | from sqlalchemy import Integer, Column, ForeignKey, func, DateTime |
@@ -61,7 +61,28 @@ def reference_col(tablename, nullable=False, pk_name='id', **kwargs): |
61 | 61 | nullable=nullable, **kwargs) |
62 | 62 |
|
63 | 63 |
|
64 | | -class EnumExt(enum.Enum): |
| 64 | +class EnumExtMeta(EnumMeta): |
| 65 | + |
| 66 | + def __new__(cls, name, bases, attrs): |
| 67 | + obj = super(EnumExtMeta, cls).__new__(cls, name, bases, attrs) |
| 68 | + |
| 69 | + keys, values = set(), set() |
| 70 | + for name, member in obj.__members__.items(): |
| 71 | + member = member.value |
| 72 | + if not isinstance(member, tuple) or len(member) != 2: |
| 73 | + raise TypeError( |
| 74 | + 'EnumExt member must be tuple type and length equal 2.') |
| 75 | + key, value = member |
| 76 | + if key in keys or value in values: |
| 77 | + raise ValueError('duplicate values found: `{}`, please check ' |
| 78 | + 'key or value.'.format(member)) |
| 79 | + keys.add(key) |
| 80 | + values.add(key) |
| 81 | + |
| 82 | + return obj |
| 83 | + |
| 84 | + |
| 85 | +class EnumExt(six.with_metaclass(EnumExtMeta, Enum)): |
65 | 86 | """ Extension for serialize/deserialize sqlalchemy enum field. |
66 | 87 |
|
67 | 88 | Be sure ``type(key)`` is ``int`` and ``type(value)`` is ``str`` |
|
0 commit comments