# # Thierry Parmentelat - INRIA # from types import StringTypes from PLC.Faults import * from PLC.Parameter import Parameter from PLC.Filter import Filter from PLC.Storage.AlchemyObject import AlchemyObj from PLC.Roles import Role, Roles # xxx todo : deleting a tag type should delete the related nodegroup(s) class TagType (AlchemyObj): """ Representation of a row in the tag_types table. """ tablename = 'tag_types' join_tables = ['tag_type_role', 'node_tag', 'interface_tag', 'slice_tag', 'site_tag', 'person_tag' ] fields = { 'tag_type_id': Parameter(int, "Node tag type identifier", primary_key=True), 'tagname': Parameter(str, "Node tag type name", max = 100), 'description': Parameter(str, "Node tag type description", max = 254), 'category' : Parameter (str, "Node tag category", max=64, optional=True), 'role_ids': Parameter([int], "List of role identifiers", joined=True), 'roles': Parameter([str], "List of roles", joined=True), } def validate_tagname(self, name): if not len(name): raise PLCInvalidArgument, "tag type name must be set" conflicts = TagTypes(self.api, [name]) for tag_type in conflicts: if 'tag_type_id' not in self or \ self['tag_type_id'] != tag_type['tag_type_id']: raise PLCInvalidArgument, "tag type name already in use" return name #add_role = Row.add_object(Role, 'tag_type_role') #remove_role = Row.remove_object(Role, 'tag_type_role') def sync(self, insert=False, validate=True): AlchemyObj.sync(self, insert, validate) if insert == True or 'tag_type_id' not in self: AlchemyObj.insert(self, dict(self)) tag_type = AlchemyObj.select(self, filter={'tagname': self['tagname']}) self['tag_type_id'] = tag_type.tag_type_id else: AlchemyObj.update(self, dict(self)) def delete(self, commit=True): AlchemyObj.delete(self, filter={'tag_type_id': self['tag_type_id']}) class TagTypes(list): """ Representation of row(s) from the tag_types table in the database. """ def __init__(self, api, tag_type_filter = None, columns = None): if not tag_type_filter: tag_types = TagType().select() elif isinstance(tag_type_filter, (list, tuple, set)): ints = filter(lambda x: isinstance(x, (int, long)), tag_type_filter) strs = filter(lambda x: isinstance(x, StringTypes), tag_type_filter) tag_types = TagType().select(filter={'tag_type_id': ints, 'tagname': strs}) elif isinstance(tag_type_filter, dict): tag_types = TagType().select(filter=tag_type_filter) elif isinstance(tag_type_filter, (int, long)): tag_types = TagType().select(filter={'tag_type_id': tag_type_filter}) elif isinstance(tag_type_filter, StringTypes): tag_types = TagType().select(filter={'tagname': tag_type_filter}) else: raise PLCInvalidArgument, "Wrong tag type filter %r"%tag_type_filter for tag_type in tag_types: self.append(TagType(api, object=tag_type, columns=columns))