source: mauRepo/MolesManager/trunk/src/ascore/asenumeration.py @ 8247

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/mauRepo/MolesManager/trunk/src/ascore/asenumeration.py@8291
Revision 8247, 3.3 KB checked in by mnagni, 8 years ago (diff)

Incomplete - # 22428: CEDA Project - observationCollection
 http://team.ceda.ac.uk/trac/ceda/ticket/22428
Complete - # 22410: CEDA Observation - resultAccumulation
 http://team.ceda.ac.uk/trac/ceda/ticket/22410
Incomplete - # 22386: CEDA Observation - title
 http://team.ceda.ac.uk/trac/ceda/ticket/22386

Line 
1'''
2Created on 5 Oct 2011
3
4@author: mnagni
5'''
6from sqlalchemy.types import SchemaType, TypeDecorator, Enum
7import re
8
9class ASEnumType(SchemaType, TypeDecorator):
10    def __init__(self, enum, regex = None):       
11        self.enum = enum
12        self.impl = Enum(
13                        *enum.values(),
14                        name="ck%s" % re.sub(
15                                    '([A-Z])',
16                                    lambda m:"_" + m.group(1).lower(),
17                                    enum.__name__)
18                    )
19        self.regex = regex
20
21    def _set_table(self, table, column):
22        self.impl._set_table(table, column)
23
24    def copy(self):
25        return ASEnumType(self.enum)
26
27    def process_bind_param(self, value, dialect):
28        if value is None:
29            return None
30        if self.__checkValue(value):
31            return value.value
32
33        return None
34
35    def process_result_value(self, value, dialect):
36        if value is None:
37            return None
38        if self.__checkValue(self.enum.from_string(value.strip())):
39            return self.enum.from_string(value.strip())
40
41        return None
42
43    def __checkValue(self, value):
44        if self.regex is not None:
45            if (re.match(self.regex, value)):
46                return value
47        if value in self.enum:
48            return True
49       
50        return False;
51
52
53class EnumSymbol(object):
54    """Define a fixed symbol tied to a parent class."""
55
56    def __init__(self, cls_, name, value, description = None):
57        self._cls = cls_
58        self.name = name
59        self.value = value
60        self.description = description
61
62    def __reduce__(self):
63        """Allow unpickling to return the symbol
64        linked to the DeclEnum class."""
65        return getattr, (self._cls, self.name)
66
67    def __iter__(self):
68        return iter([self.value, self.description])
69
70    def __repr__(self):
71        return "<%s>" % self.name
72
73class EnumMeta(type):
74
75    def __init__(cls, classname, bases, dict_):
76        cls._reg = reg = cls._reg.copy()
77        for k, v in dict_.items():
78            if k.startswith('_'):
79                continue
80           
81            if isinstance(v, tuple):
82                sym = reg[v[0]] = EnumSymbol(cls, k, *v)
83                setattr(cls, k, sym)
84            elif isinstance(v, str):
85                sym = reg[v] = EnumSymbol(cls, k, v)
86                setattr(cls, k, sym)
87        return type.__init__(cls, classname, bases, dict_)
88
89    def __iter__(self):
90        return iter(self._reg.values())
91
92class ASEnumeration(object):
93    """Declarative enumeration."""
94
95    __metaclass__ = EnumMeta
96    _reg = {}
97
98    @classmethod
99    def from_string(cls, value):
100        try:
101            return cls._reg[value]
102        except KeyError:
103            raise ValueError(
104                    "Invalid value for %r: %r" %
105                    (cls.__name__, value)
106                )
107
108    @classmethod
109    def values(cls):
110        return cls._reg.keys()
111   
112    @classmethod
113    def db_type(cls):
114        return ASEnumType(cls)
115   
116
117class EmployeeType(ASEnumeration):
118    part_time = "part_time", "Part Time"
119    full_time = "full_time", "Full Time"
120    contractor = "contractor", "Contractor"
121
122'''
123emp = EmployeeType()
124print (emp)
125print EmployeeType.values()
126print EmployeeType.contractor
127print EmployeeType.from_string('mau')
128print EmployeeType.from_string('contractor')
129'''
130   
Note: See TracBrowser for help on using the repository browser.