X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FAddressTypes.py;h=19f9b1689efa18b2c6f46fc00e46fd66f99ddb2d;hb=4e032a0867c7b8d99d0af92fdc2175918338f875;hp=4f6fe768ade9f47f5d7f5e50138ae98227414634;hpb=1b39c6ff01ea07efa4f102757c5bcac3d637ae1b;p=plcapi.git diff --git a/PLC/AddressTypes.py b/PLC/AddressTypes.py index 4f6fe76..19f9b16 100644 --- a/PLC/AddressTypes.py +++ b/PLC/AddressTypes.py @@ -4,12 +4,13 @@ # Mark Huang # Copyright (C) 2006 The Trustees of Princeton University # -# $Id: AddressTypes.py,v 1.1 2006/09/06 15:36:06 mlhuang Exp $ +# $Id: AddressTypes.py,v 1.8 2006/11/09 03:07:42 mlhuang Exp $ # from types import StringTypes from PLC.Faults import * from PLC.Parameter import Parameter +from PLC.Filter import Filter from PLC.Table import Row, Table class AddressType(Row): @@ -20,25 +21,19 @@ class AddressType(Row): table_name = 'address_types' primary_key = 'address_type_id' + join_tables = ['address_address_type'] fields = { 'address_type_id': Parameter(int, "Address type identifier"), 'name': Parameter(str, "Address type", max = 20), 'description': Parameter(str, "Address type description", max = 254), } - def __init__(self, api, fields = {}): - Row.__init__(self, fields) - self.api = api - def validate_name(self, name): - # Remove leading and trailing spaces - name = name.strip() - - # Make sure name is not blank after we removed the spaces - if not name: + # Make sure name is not blank + if not len(name): raise PLCInvalidArgument, "Address type must be specified" - # Make sure node group does not alredy exist + # Make sure address type does not already exist conflicts = AddressTypes(self.api, [name]) for address_type_id in conflicts: if 'address_type_id' not in self or self['address_type_id'] != address_type_id: @@ -46,41 +41,26 @@ class AddressType(Row): return name - def delete(self, commit = True): - assert 'address_type_id' in self - - # Clean up miscellaneous join tables - for table in ['address_address_type', 'address_types']: - self.api.db.do("DELETE FROM %s" \ - " WHERE address_type_id = %d" % \ - (table, self['address_type_id']), self) - - if commit: - self.api.db.commit() - class AddressTypes(Table): """ Representation of the address_types table in the database. """ - def __init__(self, api, address_type_id_or_name_list = None): - sql = "SELECT %s FROM address_types" % \ - ", ".join(AddressType.fields) - - if address_type_id_or_name_list: - # Separate the list into integers and strings - address_type_ids = filter(lambda address_type_id: isinstance(address_type_id, (int, long)), - address_type_id_or_name_list) - names = filter(lambda name: isinstance(name, StringTypes), - address_type_id_or_name_list) - sql += " WHERE (False" - if address_type_ids: - sql += " OR address_type_id IN (%s)" % ", ".join(map(str, address_type_ids)) - if names: - sql += " OR name IN (%s)" % ", ".join(api.db.quote(names)) - sql += ")" + def __init__(self, api, address_type_filter = None, columns = None): + Table.__init__(self, api, AddressType, columns) + + sql = "SELECT %s FROM address_types WHERE True" % \ + ", ".join(self.columns) - rows = api.db.selectall(sql) + if address_type_filter is not None: + if isinstance(address_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), address_type_filter) + strs = filter(lambda x: isinstance(x, StringTypes), address_type_filter) + address_type_filter = Filter(AddressType.fields, {'address_type_id': ints, 'name': strs}) + sql += " AND (%s)" % address_type_filter.sql(api, "OR") + elif isinstance(address_type_filter, dict): + address_type_filter = Filter(AddressType.fields, address_type_filter) + sql += " AND (%s)" % address_type_filter.sql(api, "AND") - for row in rows: - self[row['address_type_id']] = AddressType(api, row) + self.selectall(sql)