ensure that a column exists in the table before attempting to filter on it
[plcapi.git] / PLC / NodeTags.py
1 #
2 # Thierry Parmentelat - INRIA
3 #
4 from PLC.Faults import *
5 from PLC.Parameter import Parameter
6 from PLC.Storage.AlchemyObject import AlchemyObj
7 from PLC.TagTypes import TagType, TagTypes
8
9 class NodeTag(AlchemyObj):
10     """
11     Representation of a row in the node_tag.
12     To use, instantiate with a dict of values.
13     """
14
15     tablename = 'node_tags'
16     fields = {
17         'node_tag_id': Parameter(int, "Node tag identifier", primary_key=True),
18         'node_id': Parameter(int, "Node identifier"),
19         'hostname' : Parameter(str, "Node hostname"),
20         'tag_type_id': TagType.fields['tag_type_id'],
21         'value': Parameter(str, "Node tag value"),
22         'tagname': TagType.fields['tagname'],
23         'description': TagType.fields['description'],
24         'category': TagType.fields['category'],
25         }
26
27     def sync(self, commit=True, validate=True):
28         AlchemyObj.sync(self, commit=commit, validate=validate)
29         if 'node_tag_id' not in self:
30             AlchemyObj.insert(self, dict(self))
31         else:
32             AlchemyObj.update(self, {'node_tag_id': self['node_tag_id']}, dict(self))
33
34     def delete(self, commit=True):
35         assert 'node_tag_id' in self
36         AlchemyObj.delete(self, dict(self))        
37
38 class NodeTags(list):
39     """
40     Representation of row(s) from the node_tag table in the
41     database.
42     """
43
44     def __init__(self, api, node_tag_filter = None, columns = None):
45
46         if not node_tag_filter:
47             node_tags = NodeTag().select()
48         elif isinstance(node_tag_filter, (list, tuple, set, int, long)):
49             node_tags = NodeTag().select(filter={'node_tag_id': node_tag_filter})
50         elif isinstance(node_tag_filter, dict):
51             node_tags = NodeTag().select(filter=node_tag_filter)
52         else:
53             raise PLCInvalidArgument, "Wrong node tag filter %r"%node_tag_filter
54
55         self.extend(node_tags)