added refresh()
[plcapi.git] / PLC / InitScripts.py
1 #
2 # Functions for interacting with the initscripts table in the database
3 #
4 # Tony Mack <tmack@cs.princeton.edu>
5 # Copyright (C) 2006 The Trustees of Princeton University
6 #
7
8 from types import StringTypes
9 from PLC.Faults import *
10 from PLC.Parameter import Parameter
11 from PLC.Storage.AlchemyObject import AlchemyObj
12
13 class InitScript(AlchemyObj):
14     """
15     Representation of a row in the initscripts table. To use,
16     instantiate with a dict of values.
17     """
18
19     tablename = 'initscripts'
20     join_tables = []
21     fields = {
22         'initscript_id': Parameter(int, "Initscript identifier", primary_key=True),
23         'name': Parameter(str, "Initscript name", max = 254),
24         'enabled': Parameter(bool, "Initscript is active"),
25         'script': Parameter(str, "Initscript"),
26         }
27
28     def validate_name(self, name):
29         """
30         validates the script name
31         """
32
33         conflicts = InitScripts(self.api, name)
34         for initscript in conflicts:
35             if 'initscript_id' not in self or self['initscript_id'] != initscript['initscript_id']:
36                 raise PLCInvalidArgument, "Initscript name already in use"
37
38         return name
39
40     def sync(self, commit=True, validate=True):
41         AlchemyObj.sync(self, commit, validate)
42         if 'initscript_id' not in self:
43             AlchemyObj.insert(self, dict(self))
44         else:
45             AlchemyObj.update(self, {'initscript_id': self['initscript_id']}, dict(self))
46
47     def delete(self, commit=True):
48         assert 'initscript_id' in self
49         AlchemyObj.delete(self, dict(self))
50
51
52 class InitScripts(list):
53     """
54     Representation of the initscripts table in the database.
55     """
56
57     def __init__(self, api, initscript_filter = None, columns = None):
58         if not initscript_filter:
59             initscripts = InitScript().select()
60         elif isinstance(initscript_filter, (list, tuple, set)):
61             # Separate the list into integers and strings
62             ints = filter(lambda x: isinstance(x, (int, long)), initscript_filter)
63             strs = filter(lambda x: isinstance(x, StringTypes), initscript_filter)
64             initscripts = InitScript().select(filter={'initscript_id': ints, 'name': strs })
65         elif isinstance(initscript_filter, dict):
66             initscripts = InitScript().select(filter=initscript_filter)
67         elif isinstance(initscript_filter, (int, long)):
68             initscripts = InitScript().select(filter={'initscript_id': initscript_filter })
69         elif isinstance(initscript_filter, StringTypes):
70             initscripts = InitScript().select(filter={'name': initscript_filter })
71         else:
72             raise PLCInvalidArgument, "Wrong initscript filter %r"%initscript_filter
73
74         for initscript in initscripts:
75             self.append(initscript)