class AssociateBzForm(Form): bug_id = BugIdField("Bug ID or URL") bugtracker = SelectField("Bugtracker", choices=[(name, name) for name in bugtrackers.keys()])
def associate_bug(report_id): result = (db.session.query(Report, OpSysComponent).join(OpSysComponent).filter( Report.id == report_id).first()) if result is None: abort(404) report, component = result is_maintainer = app.config["EVERYONE_IS_MAINTAINER"] if not is_maintainer and g.user is not None: if user_is_maintainer(db, g.user.username, component.id): is_maintainer = True if not is_maintainer: flash("You are not the maintainer of this component.", "danger") return redirect(url_for("reports.item", report_id=report_id)) form = AssociateBzForm(request.form) if request.method == "POST" and form.validate(): bug_id = form.bug_id.data reportbug = (db.session.query( ReportBz).filter((ReportBz.report_id == report.id) & (ReportBz.bzbug_id == bug_id)).first()) if reportbug: flash("Bug already associated.", "danger") else: bug = get_bz_bug(db, bug_id) if not bug: tracker = bugtrackers[form.bugtracker.data] try: bug = tracker.download_bug_to_storage_no_retry(db, bug_id) except Exception as e: flash("Failed to fetch bug. {0}".format(str(e)), "danger") raise if bug: new = ReportBz() new.report = report new.bzbug = bug db.session.add(new) db.session.flush() db.session.commit() flash("Bug successfully associated.", "success") return redirect(url_for("reports.item", report_id=report_id)) else: flash("Failed to fetch bug.", "danger") bthash_url = url_for("reports.bthash_forward", bthash=report.hashes[0].hash, _external=True) new_bug_params = { "component": component.name, "short_desc": "[abrt] [faf] {0}: {1}(): {2} killed by {3}".format( component.name, report.crash_function, ",".join(exe.path for exe in report.executables), report.errname), "comment": "This bug has been created based on an anonymous crash " "report requested by the package maintainer.\n\n" "Report URL: {0}".format(bthash_url), "bug_file_loc": bthash_url } new_bug_urls = [] for rosr in report.opsysreleases: osr = rosr.opsysrelease for bugtracker in bugtrackers.keys(): try: params = new_bug_params.copy() if osr.opsys.name.startswith("Red Hat"): params.update(product="{0} {1}".format( osr.opsys.name, osr.version[0]), version=osr.version) else: params.update(product=osr.opsys.name, version=osr.version) print(params) new_bug_urls.append( ("{0} {1} in {2}".format(osr.opsys.name, osr.version, bugtracker), "{0}?{1}".format(bugtrackers[bugtracker].new_bug_url, urllib.urlencode(params)))) except: pass return render_template("reports/associate_bug.html", form=form, report=report, new_bug_urls=new_bug_urls)
def associate_bug(report_id): result = (db.session.query(Report, OpSysComponent) .join(OpSysComponent) .filter(Report.id == report_id) .first()) if result is None: abort(404) report, component = result is_maintainer = is_component_maintainer(db, g.user, component) if not is_maintainer: flash("You are not the maintainer of this component.", "danger") return redirect(url_for("reports.item", report_id=report_id)) form = AssociateBzForm(request.form) if request.method == "POST" and form.validate(): bug_id = form.bug_id.data reportbug = (db.session.query(ReportBz) .filter( (ReportBz.report_id == report.id) & (ReportBz.bzbug_id == bug_id)) .first()) if reportbug: flash("Bug already associated.", "danger") else: bug = get_bz_bug(db, bug_id) if not bug: tracker = bugtrackers[form.bugtracker.data] try: bug = tracker.download_bug_to_storage_no_retry(db, bug_id) except Exception as e: flash("Failed to fetch bug. {0}".format(str(e)), "danger") raise if bug: new = ReportBz() new.report = report new.bzbug = bug db.session.add(new) db.session.flush() db.session.commit() flash("Bug successfully associated.", "success") return redirect(url_for("reports.item", report_id=report_id)) else: flash("Failed to fetch bug.", "danger") bthash_url = url_for("reports.bthash_forward", bthash=report.hashes[0].hash, _external=True) new_bug_params = { "component": component.name, "short_desc": "[abrt] [faf] {0}: {1}(): {2} killed by {3}" .format(component.name, report.crash_function, ",".join(exe.path for exe in report.executables), report.errname ), "comment": "This bug has been created based on an anonymous crash " "report requested by the package maintainer.\n\n" "Report URL: {0}" .format(bthash_url), "bug_file_loc": bthash_url } new_bug_urls = [] for rosr in report.opsysreleases: osr = rosr.opsysrelease for bugtracker in bugtrackers.keys(): try: params = new_bug_params.copy() if osr.opsys.name.startswith("Red Hat"): params.update(product="{0} {1}".format(osr.opsys.name, osr.version[0]), version=osr.version) else: params.update(product=osr.opsys.name, version=osr.version) print(params) new_bug_urls.append( ("{0} {1} in {2}".format(osr.opsys.name, osr.version, bugtracker), "{0}?{1}".format( bugtrackers[bugtracker].new_bug_url, urllib.urlencode(params)) ) ) except: pass return render_template("reports/associate_bug.html", form=form, report=report, new_bug_urls=new_bug_urls)
def add_bugtracker(self, *args, **kwargs): field = SelectField("Bugtracker", choices=((bt, bt) for bt in bugtrackers.keys())) setattr(self.F, "bugtracker", field) self.F.argparse_fields["bugtracker"] = {}