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
Example #2
0
 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
Example #4
0
 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