1
from utils.datatypes import *
6
Base class for elements with typed properties.
7
Classes deriving from this base class have to call
9
_register_property(name, datatype, setter, getter, default, doc)
11
in the constructor. Properties can then be set with
20
If you don't need any special setter or getter methods, then you can use
21
the predefined _setp(key, value) and _getp(key) methods.
24
__slots__ = ('__name', '__properties', '__property_handlers',
27
AUTHORIZED_METHODS = ()
29
# counter for unique IDs
33
def __init__(self, name):
38
# values of the properties
39
self.__properties = {}
41
# table: property name -> (setter, getter, datatype, doc)
42
self.__property_handlers = {}
45
new_id = "id%d" % self.__ident_counter
46
self.__ident_counter += 1
47
self._register_property("id", TYPE_STRING, self._setp, self._getp,
48
new_id, doc = "Unique identifier")
53
# Registers the given property with the given setter and getter methods.
55
def _register_property(self, name, datatype, setter, getter,
56
default = None, doc = ""):
58
self.__property_handlers[name] = (setter, getter, datatype, doc)
59
self._setp(name, default)
64
# Sets the given property as a string.
66
def set_prop_from_string(self, key, value):
68
value = str(value) # to stay compatible with sensors :(
69
key = key.replace("_", "-")
71
datatype = self.get_datatype_of_property(key)
75
from utils import typeconverter
76
self.set_prop(key, typeconverter.str2type(datatype, value))
81
# Sets the given property.
83
def set_prop(self, key, value):
85
key = key.replace("_", "-")
87
setter = self.__property_handlers[key][0]
88
datatype = self.__property_handlers[key][2]
91
raise UserError(_("No such property: %s") % key,
92
_("The element <b>%s</b> does not have the "
93
"<b>%s</b> property.") % (self.__name, key))
96
raise UserError(_("Permission Error"),
97
_("The property <b>%s</b> of element <b>%s</b> "
98
"is not writable.") % (key, self.__name))
100
elif (dtype_check(datatype, value)):
104
actual_type = dtype_guess(value)
105
raise UserError(_("Type Error"),
106
_("The property <b>%s</b> of element <b>%s</b> "
107
"got a value of wrong type.\n"
108
"Expected <b>%s</b>, but got <b>%s</b>."
109
% (key, self.__name, datatype[0],
115
# Returns the value of the given property.
117
def get_prop(self, key):
119
key = key.replace("_", "-")
121
getter = self.__property_handlers[key] [1]
123
raise KeyError("Error: No such property: %s" % key)
126
raise UserError(_("Permission Error"),
127
_("The property <b>%s</b> of element <b>%s</b> "
128
"is not readable.") % (key, self.__name))
136
# Returns the datatype of the given property.
138
def get_datatype_of_property(self, prop):
140
# we intentionally don't catch the KeyError here
141
return self.__property_handlers[prop][2]
146
# Returns the documentation string of the given property.
148
def get_doc_of_property(self, prop):
151
doc = self.__property_handlers[prop][3]
160
# Returns a list of the names of all available properties.
162
def get_props(self): return self.__property_handlers.keys()
167
# Generic setter and getter methods for properties.
169
def _setp(self, key, value): self.__properties[key] = value
170
def _getp(self, key): return self.__properties[key]
174
# Returns the element's name
176
def get_name(self): return self.__name