X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FRoles.py;h=fcc05f4bd609edf609d01d7047d8b53ef46ff84b;hb=19d4a01ccf66af9e00914351b3eacd5fc880f988;hp=8896647edcbc7b231838f96731339e5b7d622a5a;hpb=fe0cd47e2b702d69bde8518a41e3661dd9ffbea7;p=plcapi.git diff --git a/PLC/Roles.py b/PLC/Roles.py index 8896647..fcc05f4 100644 --- a/PLC/Roles.py +++ b/PLC/Roles.py @@ -4,12 +4,11 @@ # Mark Huang # Copyright (C) 2006 The Trustees of Princeton University # -# $Id: Roles.py,v 1.3 2006/10/10 21:54:59 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 Role(Row): @@ -20,76 +19,60 @@ class Role(Row): table_name = 'roles' primary_key = 'role_id' + join_tables = ['person_role', 'tag_type_role' ] fields = { 'role_id': Parameter(int, "Role identifier"), 'name': Parameter(str, "Role", max = 100), } - def __init__(self, api, fields = {}): - Row.__init__(self, fields) - self.api = api - def validate_role_id(self, role_id): - # Make sure role does not already exist - conflicts = Roles(self.api, [role_id]) + # Make sure role does not already exist + conflicts = Roles(self.api, [role_id]) if conflicts: raise PLCInvalidArgument, "Role ID already in use" return role_id 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, "Role must be specified" - - # Make sure role does not already exist - conflicts = Roles(self.api, [name]) + + # Make sure role does not already exist + conflicts = Roles(self.api, [name]) if conflicts: raise PLCInvalidArgument, "Role name already in use" - return name - - def delete(self, commit = True): - assert 'role_id' in self + return name - # Clean up miscellaneous join tables - for table in ['person_role', 'roles']: - self.api.db.do("DELETE FROM %s" \ - " WHERE role_id = %d" % \ - (table, self['role_id']), self) - - self.api.db.do("DELETE FROM slice_attribute_types WHERE min_role_id = %d" % \ - self['role_id']) - - if commit: - self.api.db.commit() - class Roles(Table): """ Representation of the roles table in the database. """ - def __init__(self, api, role_id_or_name_list = None): - sql = "SELECT %s FROM roles" % \ - ", ".join(Role.fields) - - if role_id_or_name_list: - # Separate the list into integers and strings - role_ids = filter(lambda role_id: isinstance(role_id, (int, long)), - role_id_or_name_list) - names = filter(lambda name: isinstance(name, StringTypes), - role_id_or_name_list) - sql += " WHERE (False" - if role_ids: - sql += " OR role_id IN (%s)" % ", ".join(map(str, role_ids)) - if names: - sql += " OR name IN (%s)" % ", ".join(api.db.quote(names)) - sql += ")" + def __init__(self, api, role_filter = None): + Table.__init__(self, api, Role) - rows = api.db.selectall(sql) + sql = "SELECT %s FROM roles WHERE True" % \ + ", ".join(Role.fields) - for row in rows: - self[row['role_id']] = Role(api, row) + if role_filter is not None: + if isinstance(role_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), role_filter) + strs = filter(lambda x: isinstance(x, StringTypes), role_filter) + role_filter = Filter(Role.fields, {'role_id': ints, 'name': strs}) + sql += " AND (%s) %s" % role_filter.sql(api, "OR") + elif isinstance(role_filter, dict): + role_filter = Filter(Role.fields, role_filter) + sql += " AND (%s) %s" % role_filter.sql(api, "AND") + elif isinstance(role_filter, (int, long)): + role_filter = Filter(Role.fields, {'role_id': role_filter}) + sql += " AND (%s) %s" % role_filter.sql(api, "AND") + elif isinstance(role_filter, StringTypes): + role_filter = Filter(Role.fields, {'name': role_filter}) + sql += " AND (%s) %s" % role_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong role filter %r"%role_filter + + self.selectall(sql)