From 072b18e8d9f59ed14086c7afae79f88368296b5b Mon Sep 17 00:00:00 2001 From: Mark Huang Date: Tue, 10 Oct 2006 20:23:49 +0000 Subject: [PATCH] interface to network_methods table --- PLC/Methods/AddNetworkMethod.py | 28 ++++++++++++ PLC/Methods/DeleteNetworkMethod.py | 31 +++++++++++++ PLC/Methods/GetNetworkMethods.py | 21 +++++++++ PLC/NetworkMethods.py | 73 ++++++++++++++++++++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 PLC/Methods/AddNetworkMethod.py create mode 100644 PLC/Methods/DeleteNetworkMethod.py create mode 100644 PLC/Methods/GetNetworkMethods.py create mode 100644 PLC/NetworkMethods.py diff --git a/PLC/Methods/AddNetworkMethod.py b/PLC/Methods/AddNetworkMethod.py new file mode 100644 index 0000000..c207e1d --- /dev/null +++ b/PLC/Methods/AddNetworkMethod.py @@ -0,0 +1,28 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +from PLC.Auth import PasswordAuth + +class AddNetworkMethod(Method): + """ + Adds a new network method. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + PasswordAuth(), + NetworkMethod.fields['method'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, name): + network_method = NetworkMethod(self.api) + network_method['method'] = name + network_method.sync() + + return 1 diff --git a/PLC/Methods/DeleteNetworkMethod.py b/PLC/Methods/DeleteNetworkMethod.py new file mode 100644 index 0000000..941ccc0 --- /dev/null +++ b/PLC/Methods/DeleteNetworkMethod.py @@ -0,0 +1,31 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +from PLC.Auth import PasswordAuth + +class DeleteNetworkMethod(Method): + """ + Deletes a network method. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + PasswordAuth(), + NetworkMethod.fields['method'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, name): + network_methods = NetworkMethods(self.api, [name]) + if not network_methods: + raise PLCInvalidArgument, "No such network method" + network_method = network_methods.values()[0] + + network_method.delete() + + return 1 diff --git a/PLC/Methods/GetNetworkMethods.py b/PLC/Methods/GetNetworkMethods.py new file mode 100644 index 0000000..aacfd3c --- /dev/null +++ b/PLC/Methods/GetNetworkMethods.py @@ -0,0 +1,21 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +from PLC.Auth import PasswordAuth + +class GetNetworkMethods(Method): + """ + Returns a list of all valid network methods. + """ + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + PasswordAuth() + ] + + returns = [NetworkMethod.fields['method']] + + def call(self, auth): + return [network_method['method'] for network_method in NetworkMethods(self.api).values()] diff --git a/PLC/NetworkMethods.py b/PLC/NetworkMethods.py new file mode 100644 index 0000000..e141429 --- /dev/null +++ b/PLC/NetworkMethods.py @@ -0,0 +1,73 @@ +# +# Functions for interacting with the network_methods table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: NetworkMethods.py,v 1.2 2006/10/06 18:19:41 mlhuang Exp $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class NetworkMethod(Row): + """ + Representation of a row in the network_methods table. To use, + instantiate with a dict of values. + """ + + table_name = 'network_methods' + primary_key = 'method' + fields = { + 'method': Parameter(str, "Network method", max = 20), + } + + def __init__(self, api, fields = {}): + Row.__init__(self, fields) + self.api = api + + def validate_method(self, name): + # Remove leading and trailing spaces + name = name.strip() + + # Make sure name is not blank after we removed the spaces + if not name: + raise PLCInvalidArgument, "Network method must be specified" + + # Make sure network method does not alredy exist + conflicts = NetworkMethods(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Network method name already in use" + + return name + + def delete(self, commit = True): + assert 'method' in self + + # Clean up miscellaneous join tables + for table in ['nodenetworks', 'network_methods']: + self.api.db.do("DELETE FROM " + table + \ + " WHERE method = %(method)s", + self) + + if commit: + self.api.db.commit() + +class NetworkMethods(Table): + """ + Representation of the network_methods table in the database. + """ + + def __init__(self, api, names = None): + sql = "SELECT %s FROM network_methods" % \ + ", ".join(NetworkMethod.fields) + + if names: + # Separate the list into integers and strings + sql += " WHERE method IN (%s)" % ", ".join(api.db.quote(names)) + + rows = api.db.selectall(sql) + + for row in rows: + self[row['method']] = NetworkMethod(api, row) -- 2.43.0