X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FSites.py;h=19b15d623435c3c66b9b396996d4c77ef0621693;hb=e31c0c31ad64731981b9302180cd5d20c225549f;hp=7474f03b039fe5ba22012dc323a1fcc3ad6567bd;hpb=e347fc823bbba9d88a3fddf07d5c21024dfd1e55;p=plcapi.git diff --git a/PLC/Sites.py b/PLC/Sites.py index 7474f03..19b15d6 100644 --- a/PLC/Sites.py +++ b/PLC/Sites.py @@ -9,9 +9,8 @@ from PLC.Table import Row, Table from PLC.Slices import Slice, Slices from PLC.PCUs import PCU, PCUs from PLC.Nodes import Node, Nodes -from PLC.NodeGroups import NodeGroup, NodeGroups from PLC.Addresses import Address, Addresses -import PLC.Persons +from PLC.Persons import Person, Persons class Site(Row): """ @@ -22,13 +21,15 @@ class Site(Row): table_name = 'sites' primary_key = 'site_id' + join_tables = ['person_site', 'site_address', 'peer_site'] fields = { 'site_id': Parameter(int, "Site identifier"), 'name': Parameter(str, "Full site name", max = 254), 'abbreviated_name': Parameter(str, "Abbreviated site name", max = 50), 'login_base': Parameter(str, "Site slice prefix", max = 20), 'is_public': Parameter(bool, "Publicly viewable site"), - 'latitude': Parameter(float, "Decimal latitude of the site", min = -90.0, max = 90.0, nullok = True), + 'enabled': Parameter(bool, "Has been enabled"), + 'latitude': Parameter(float, "Decimal latitude of the site", min = -90.0, max = 90.0, nullok = True), 'longitude': Parameter(float, "Decimal longitude of the site", min = -180.0, max = 180.0, nullok = True), 'url': Parameter(str, "URL of a page that describes the site", max = 254, nullok = True), 'date_created': Parameter(int, "Date and time when site entry was created, in seconds since UNIX epoch", ro = True), @@ -40,8 +41,20 @@ class Site(Row): 'address_ids': Parameter([int], "List of address identifiers"), 'pcu_ids': Parameter([int], "List of PCU identifiers"), 'node_ids': Parameter([int], "List of site node identifiers"), + 'peer_id': Parameter(int, "Peer to which this site belongs", nullok = True), + 'peer_site_id': Parameter(int, "Foreign site identifier at peer", nullok = True), } + # for Cache + class_key = 'login_base' + foreign_fields = ['abbreviated_name', 'name', 'is_public', 'latitude', 'longitude', + 'url', 'max_slices', 'max_slivers', + ] + # forget about these ones, they are read-only anyway + # handling them causes Cache to re-sync all over again + # 'last_updated', 'date_created' + foreign_xrefs = [] + def validate_name(self, name): if not len(name): raise PLCInvalidArgument, "Name must be specified" @@ -54,8 +67,8 @@ class Site(Row): if not len(login_base): raise PLCInvalidArgument, "Login base must be specified" - if not set(login_base).issubset(string.ascii_letters.lower()): - raise PLCInvalidArgument, "Login base must consist only of lowercase ASCII letters" + if not set(login_base).issubset(string.lowercase + string.digits): + raise PLCInvalidArgument, "Login base must consist only of lowercase ASCII letters or numbers" conflicts = Sites(self.api, [login_base]) for site in conflicts: @@ -78,101 +91,14 @@ class Site(Row): return longitude - def add_person(self, person, commit = True): - """ - Add person to existing site. - """ - - assert 'site_id' in self - assert isinstance(person, PLC.Persons.Person) - assert 'person_id' in person - - site_id = self['site_id'] - person_id = person['person_id'] - - if person_id not in self['person_ids']: - assert site_id not in person['site_ids'] - - self.api.db.do("INSERT INTO person_site (person_id, site_id)" \ - " VALUES(%(person_id)d, %(site_id)d)", - locals()) - - if commit: - self.api.db.commit() - - self['person_ids'].append(person_id) - person['site_ids'].append(site_id) - - def remove_person(self, person, commit = True): - """ - Remove person from existing site. - """ - - assert 'site_id' in self - assert isinstance(person, PLC.Persons.Person) - assert 'person_id' in person - - site_id = self['site_id'] - person_id = person['person_id'] - - if person_id in self['person_ids']: - assert site_id in person['site_ids'] - - self.api.db.do("DELETE FROM person_site" \ - " WHERE person_id = %(person_id)d" \ - " AND site_id = %(site_id)d", - locals()) - - if commit: - self.api.db.commit() - - self['person_ids'].remove(person_id) - person['site_ids'].remove(site_id) - - def add_address(self, address, commit = True): - """ - Add address to existing site. - """ - - assert 'site_id' in self - assert isinstance(address, Address) - assert 'address_id' in address - - site_id = self['site_id'] - address_id = address['address_id'] - - if address_id not in self['address_ids']: - self.api.db.do("INSERT INTO site_address (address_id, site_id)" \ - " VALUES(%(address_id)d, %(site_id)d)", - locals()) - - if commit: - self.api.db.commit() - - self['address_ids'].append(address_id) - - def remove_address(self, address, commit = True): - """ - Remove address from existing site. - """ - - assert 'site_id' in self - assert isinstance(address, Address) - assert 'address_id' in address - - site_id = self['site_id'] - address_id = address['address_id'] - - if address_id in self['address_ids']: - self.api.db.do("DELETE FROM site_address" \ - " WHERE address_id = %(address_id)d" \ - " AND site_id = %(site_id)d", - locals()) + validate_date_created = Row.validate_timestamp + validate_last_updated = Row.validate_timestamp - if commit: - self.api.db.commit() + add_person = Row.add_object(Person, 'person_site') + remove_person = Row.remove_object(Person, 'person_site') - self['address_ids'].remove(address_id) + add_address = Row.add_object(Address, 'site_address') + remove_address = Row.remove_object(Address, 'site_address') def delete(self, commit = True): """ @@ -183,7 +109,7 @@ class Site(Row): # Delete accounts of all people at the site who are not # members of at least one other non-deleted site. - persons = PLC.Persons.Persons(self.api, self['person_ids']) + persons = Persons(self.api, self['person_ids']) for person in persons: delete = True @@ -217,10 +143,9 @@ class Site(Row): node.delete(commit = False) # Clean up miscellaneous join tables - for table in ['person_site']: - self.api.db.do("DELETE FROM %s" \ - " WHERE site_id = %d" % \ - (table, self['site_id']), self) + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE site_id = %d" % \ + (table, self['site_id'])) # Mark as deleted self['deleted'] = True