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