def new_bug(self, summary=None, _uuid=None): bg = bug.Bug(bugdir=self, uuid=_uuid, summary=summary, from_storage=False) self.append(bg) self._bug_map_gen() if hasattr(self, '_uuids_cache') and not bg.uuid in self._uuids_cache: self._uuids_cache.add(bg.uuid) return bg
def from_xml(self, xml_string, preserve_uuids=False): """ Note: If a bugdir uuid is given, set .alt_id to it's value. >>> bug.load_severities(bug.severity_def) >>> bug.load_status( ... active_status_def=bug.active_status_def, ... inactive_status_def=bug.inactive_status_def) >>> bugdirA = SimpleBugDir(memory=True) >>> bugdirA.severities = (('minor', 'The standard bug level.'),) >>> bugdirA.inactive_status = ( ... ('closed', 'The bug is no longer relevant.'),) >>> bugA = bugdirA.bug_from_uuid('a') >>> commA = bugA.comment_root.new_reply(body='comment A') >>> commA.uuid = 'commA' >>> xml = bugdirA.xml(show_bugs=True, show_comments=True) >>> bugdirB = BugDir(storage=None) >>> bugdirB.from_xml(xml) >>> bugdirB.xml(show_bugs=True, show_comments=True) == xml False >>> bugdirB.uuid = bugdirB.alt_id >>> for bug_ in bugdirB: ... bug_.uuid = bug_.alt_id ... bug_.alt_id = None ... for comm in bug_.comments(): ... comm.uuid = comm.alt_id ... comm.alt_id = None >>> bugdirB.xml(show_bugs=True, show_comments=True) == xml True >>> bugdirB.explicit_attrs # doctest: +NORMALIZE_WHITESPACE ['severities', 'inactive_status'] >>> bugdirC = BugDir(storage=None) >>> bugdirC.from_xml(xml, preserve_uuids=True) >>> bugdirC.uuid == bugdirA.uuid True >>> bugdirC.xml(show_bugs=True, show_comments=True) == xml True >>> bug.load_severities(bug.severity_def) >>> bug.load_status( ... active_status_def=bug.active_status_def, ... inactive_status_def=bug.inactive_status_def) >>> bugdirA.cleanup() """ if type(xml_string) == types.UnicodeType: xml_string = xml_string.strip().encode('unicode_escape') if hasattr(xml_string, 'getchildren'): # already an ElementTree Element bugdir = xml_string else: bugdir = ElementTree.XML(xml_string) if bugdir.tag != 'bugdir': raise utility.InvalidXML( 'bugdir', bugdir, 'root element must be <bugdir>') tags = ['uuid', 'short-name', 'target', 'severities', 'active-status', 'inactive-status', 'extra-string'] self.explicit_attrs = [] uuid = None estrs = [] for child in bugdir.getchildren(): if child.tag == 'short-name': pass elif child.tag == 'bug': bg = bug.Bug(bugdir=self) bg.from_xml(child, preserve_uuids=preserve_uuids) self.append(bg, update=True) continue elif child.tag in tags: if child.text == None or len(child.text) == 0: text = settings_object.EMPTY elif child.tag in ['severities', 'active-status', 'inactive-status']: entries = [] for entry in child.getchildren(): if entry.tag != 'entry': raise utility.InvalidXML( '{} child element {} must be <entry>'.format( child.tag, entry)) key = value = None for kv in entry.getchildren(): if kv.tag == 'key': if key is not None: raise utility.InvalidXML( ('duplicate keys ({} and {}) in {}' ).format(key, kv.text, child.tag)) key = xml.sax.saxutils.unescape(kv.text) elif kv.tag == 'value': if value is not None: raise utility.InvalidXML( ('duplicate values ({} and {}) in {}' ).format( value, kv.text, child.tag)) value = xml.sax.saxutils.unescape(kv.text) else: raise utility.InvalidXML( ('{} child element {} must be <key> or ' '<value>').format(child.tag, kv)) if key is None: raise utility.InvalidXML( 'no key for {}'.format(child.tag)) if value is None: raise utility.InvalidXML( 'no key for {}'.format(child.tag)) entries.append((key, value)) text = entries else: text = xml.sax.saxutils.unescape(child.text) if not isinstance(text, unicode): text = text.decode('unicode_escape') text = text.strip() if child.tag == 'uuid' and not preserve_uuids: uuid = text continue # don't set the bug's uuid tag. elif child.tag == 'extra-string': estrs.append(text) continue # don't set the bug's extra_string yet. attr_name = child.tag.replace('-','_') self.explicit_attrs.append(attr_name) setattr(self, attr_name, text) else: libbe.LOG.warning( 'ignoring unknown tag {0} in {1}'.format( child.tag, bugdir.tag)) if uuid != self.uuid: if not hasattr(self, 'alt_id') or self.alt_id == None: self.alt_id = uuid self.extra_strings = estrs
def _load_bug(self, uuid): bg = bug.Bug(bugdir=self, uuid=uuid, from_storage=True) self.append(bg) self._bug_map_gen() return bg
def new_bug(self, summary=None, _uuid=None): bg = bug.Bug(bugdir=self, uuid=_uuid, summary=summary, from_storage=False) self.append(bg, update=True) return bg