embed svn Id keyword
[plcapi.git] / PLC / Addresses.py
1 # $Id#
2 from PLC.Faults import *
3 from PLC.Parameter import Parameter
4 from PLC.Table import Row, Table
5 from PLC.Filter import Filter
6 from PLC.AddressTypes import AddressType, AddressTypes
7
8 class Address(Row):
9     """
10     Representation of a row in the addresses table. To use, instantiate
11     with a dict of values.
12     """
13
14     table_name = 'addresses'
15     primary_key = 'address_id'
16     join_tables = ['address_address_type', 'site_address']
17     fields = {
18         'address_id': Parameter(int, "Address identifier"),
19         'line1': Parameter(str, "Address line 1", max = 254),
20         'line2': Parameter(str, "Address line 2", max = 254, nullok = True),
21         'line3': Parameter(str, "Address line 3", max = 254, nullok = True),
22         'city': Parameter(str, "City", max = 254),
23         'state': Parameter(str, "State or province", max = 254),
24         'postalcode': Parameter(str, "Postal code", max = 64),
25         'country': Parameter(str, "Country", max = 128),
26         'address_type_ids': Parameter([int], "Address type identifiers"),
27         'address_types': Parameter([str], "Address types"),
28         }
29
30     def add_address_type(self, address_type, commit = True):
31         """
32         Add address type to existing address.
33         """
34
35         assert 'address_id' in self
36         assert isinstance(address_type, AddressType)
37         assert 'address_type_id' in address_type
38
39         address_id = self['address_id']
40         address_type_id = address_type['address_type_id']
41
42         if address_type_id not in self['address_type_ids']:
43             assert address_type['name'] not in self['address_types']
44
45             self.api.db.do("INSERT INTO address_address_type (address_id, address_type_id)" \
46                            " VALUES(%(address_id)d, %(address_type_id)d)",
47                            locals())
48
49             if commit:
50                 self.api.db.commit()
51
52             self['address_type_ids'].append(address_type_id)
53             self['address_types'].append(address_type['name'])
54
55     def remove_address_type(self, address_type, commit = True):
56         """
57         Add address type to existing address.
58         """
59
60         assert 'address_id' in self
61         assert isinstance(address_type, AddressType)
62         assert 'address_type_id' in address_type
63
64         address_id = self['address_id']
65         address_type_id = address_type['address_type_id']
66
67         if address_type_id in self['address_type_ids']:
68             assert address_type['name'] in self['address_types']
69
70             self.api.db.do("DELETE FROM address_address_type" \
71                            " WHERE address_id = %(address_id)d" \
72                            " AND address_type_id = %(address_type_id)d",
73                            locals())
74
75             if commit:
76                 self.api.db.commit()
77
78             self['address_type_ids'].remove(address_type_id)
79             self['address_types'].remove(address_type['name'])
80
81 class Addresses(Table):
82     """
83     Representation of row(s) from the addresses table in the
84     database.
85     """
86
87     def __init__(self, api, address_filter = None, columns = None):
88         Table.__init__(self, api, Address, columns)
89
90         sql = "SELECT %s FROM view_addresses WHERE True" % \
91               ", ".join(self.columns)
92
93         if address_filter is not None:
94             if isinstance(address_filter, (list, tuple, set)):
95                 address_filter = Filter(Address.fields, {'address_id': address_filter})
96             elif isinstance(address_filter, dict):
97                 address_filter = Filter(Address.fields, address_filter)
98             sql += " AND (%s) %s" % address_filter.sql(api)
99
100         self.selectall(sql)