def _save_history(self, db, events, new_bug_id): """ Save bug history to the database. Expects list of `events` and ID of the bug as `new_bug_id`. """ total = len(events) for num, event in enumerate(events): self.log_debug("Processing history event {0}/{1}".format(num + 1, total)) user_email = event["who"] user = queries.get_bz_user(db, user_email) if not user: self.log_debug("History changed by unknown user #{0}".format( user_email)) downloaded = self._download_user(user_email) if not downloaded: self.log_error("Unable to download user, skipping.") continue user = self._save_user(db, downloaded) for change in event["changes"]: chtime = self._convert_datetime(event["when"]) ch = ( db.session.query(BzBugHistory) .filter((BzBugHistory.user == user) & (BzBugHistory.time == chtime) & (BzBugHistory.field == change["field_name"]) & (BzBugHistory.added == change["added"]) & (BzBugHistory.removed == change["removed"])) .first()) if ch: self.log_debug("Skipping existing history event " "#{0}".format(ch.id)) continue new = BzBugHistory() new.bug_id = new_bug_id new.user = user new.time = chtime new.field = change["field_name"] new.added = change["added"][:column_len(BzBugHistory, "added")] new.removed = change["removed"][:column_len(BzBugHistory, "removed")] db.session.add(new) db.session.flush()