Design + Execution first netns prototype working
[nepi.git] / src / nepi / core / attributes.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 class AttributesMap(object):
5     """AttributesMap is the base class for every object whose attributes 
6     are going to be manipulated by the end-user in a script or GUI.
7     """
8     def __init__(self):
9         self._attributes = dict()
10
11     @property
12     def attributes(self):
13         return self._attributes.values()
14
15     @property
16     def attributes_name(self):
17         return self._attributes.keys()
18
19     def set_attribute_value(self, name, value):
20         self._attributes[name].value = value
21
22     def set_attribute_readonly(self, name, readonly = True):
23         self._attributes[name].readonly = (readonly == True)
24
25     def get_attribute_value(self, name):
26         return self._attributes[name].value
27
28     def get_attribute_help(self, name):
29         return self._attributes[name].help
30
31     def get_attribute_type(self, name):
32         return self._attributes[name].type
33
34     def get_attribute_range(self, name):
35         if not self._attributes[name].range:
36             return (None, None)
37         return self._attributes[name].range
38
39     def get_attribute_allowed(self, name):
40         return self._attributes[name].allowed
41
42     def get_attribute_readonly(self, name):
43         return self._attributes[name].readonly
44
45     def get_attribute_visible(self, name):
46         return self._attributes[name].visible
47
48     def is_attribute_modified(self, name):
49         return self._attributes[name].modified
50
51     def add_attribute(self, name, help, type, value = None, range = None,
52         allowed = None, readonly = False, visible = True, 
53         validation_function = None):
54         if name in self._attributes:
55             raise AttributeError("Attribute %s already exists" % name)
56         attribute = Attribute(name, help, type, value, range, allowed, readonly,
57                 visible, validation_function)
58         self._attributes[name] = attribute
59
60     def del_attribute(self, name):
61         del self._attributes[name]
62
63     def has_attribute(self, name):
64         return name in self._attributes    
65     
66     def destroy(self):
67         self._attributes = dict()
68
69 class Attribute(object):
70     STRING, BOOL, ENUM, DOUBLE, INTEGER = (
71                 "STRING", "BOOL", "ENUM", "DOUBLE", "INTEGER")
72
73     types = [STRING, BOOL, ENUM, DOUBLE, INTEGER]
74
75     def __init__(self, name, help, type, value = None, range = None,
76         allowed = None, readonly = False, visible = True, 
77         validation_function = None):
78         if not type in Attribute.types:
79             raise AttributeError("invalid type %s " % type)
80         self.name = name
81         self._type = type
82         self._help = help
83         self._value = value
84         self._validation_function = validation_function
85         # readonly attributes can be seen but not changed by users
86         self._readonly = (readonly == True)
87         # invisible attributes cannot be seen or changed by users
88         self._visible = (visible == True)
89         self._modified = False
90         # range: max and min possible values
91         self._range = range
92         # list of possible values
93         self._allowed = allowed
94
95     @property
96     def type(self):
97         return self._type
98
99     @property
100     def help(self):
101         return self._help
102
103     @property
104     def visible(self):
105         return self._visible
106
107     @property
108     def readonly(self):
109         return self._readonly
110
111     @property
112     def modified(self):
113         return self._modified
114
115     @property
116     def range(self):
117         return self._range
118
119     @property
120     def allowed(self):
121         return self._allowed
122
123     @property
124     def validation_function(self):
125         return self._validation_function
126
127     def get_value(self):
128         return self._value
129
130     def set_value(self, value):
131         if self._is_in_range(value) and \
132                 self._is_in_allowed_values(value) and \
133                 self._is_valid(value):
134             self._value = value
135             self._modified = True
136         else:
137             raise RuntimeError("Invalid value %s for attribute %s" %
138                     (str(value), self.name))
139
140     value = property(get_value, set_value)
141
142     def _is_in_range(self, value):
143         return not self.range or \
144                 (value >= self.range[0] and value <= self.range[1])
145
146     def _is_in_allowed_values(self, value):
147         return not self.allowed or value in self._allowed
148
149     def _is_valid(self, value):
150         return not self._validation_function or self._validation_function(value)
151