fix sql filtering on list values
[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.Nodes import Node, Nodes
8 from PLC.TagTypes import TagType, TagTypes
9
10 class NodeTag(AlchemyObj):
11     """
12     Representation of a row in the node_tag.
13     To use, instantiate with a dict of values.
14     """
15
16     tablename = 'node_tags'
17     fields = {
18         'node_tag_id': Parameter(int, "Node tag identifier", primary_key=True),
19         'node_id': Node.fields['node_id'],
20         'hostname' : Node.fields['hostname'],
21         'tag_type_id': TagType.fields['tag_type_id'],
22         'value': Parameter(str, "Node tag value"),
23         'tagname': TagType.fields['tagname'],
24         'description': TagType.fields['description'],
25         'category': TagType.fields['category'],
26         }
27
28     def sync(self, commit=True, validate=True):
29         AlchemyObj.sync(self, commit=commit, validate=validate)
30         if 'node_tag_id' not in self:
31             AlchemyObj.insert(self, dict(self))
32         else:
33             AlchemyObj.update(self, {'node_tag_id': self['node_tag_id']}, dict(self))
34
35     def delete(self, commit=True):
36         assert 'node_tag_id' in self
37         AlchemyObj.delete(self, dict(self))        
38
39 class NodeTags(list):
40     """
41     Representation of row(s) from the node_tag table in the
42     database.
43     """
44
45     def __init__(self, api, node_tag_filter = None, columns = None):
46
47         if not node_tag_filter:
48             node_tags = NodeTag().select()
49         elif isinstance(node_tag_filter, (list, tuple, set, int, long)):
50             node_tags = NodeTag().select(filter={'node_tag_id': node_tag_filter})
51         elif isinstance(node_tag_filter, dict):
52             node_tags = NodeTag().select(filter=node_tag_filter)
53         else:
54             raise PLCInvalidArgument, "Wrong node tag filter %r"%node_tag_filter
55
56         self.extend(node_tags)