Example #1
0
    def components(self, cmdline, db, opsys, release):
        """
        Get statistics for most crashing components
        """

        hist_table, hist_field = get_history_target(self.history_type)
        total = get_history_sum(db, opsys, release)
        comps = get_report_count_by_component(db, opsys, release)

        if cmdline.last:
            now = datetime.datetime.now()
            since = now - datetime.timedelta(days=int(cmdline.last))
            comps = comps.filter(hist_field >= since)
            total = total.filter(hist_field >= since)

        total_num = total.first()[0]

        limit = int(cmdline.count)
        limit_details = int(cmdline.detail_count)
        results = []

        for num, (comp, count) in enumerate(comps):
            if num >= limit:
                break

            if comp in self.comps_filter:
                continue

            reports = get_report_stats_by_component(db, comp, opsys, release,
                                                    self.history_type)

            if cmdline.last:
                reports = reports.filter(hist_field >= since)

            problem_ids = set()
            attached_reports = []

            for report, report_count in reports:
                if len(problem_ids) >= limit_details:
                    break
                if not report.problem:
                    continue
                if report.problem.id in problem_ids:
                    continue
                if report.quality < 0 and not cmdline.include_low_quality:
                    continue

                problem_ids.add(report.problem.id)

                problem_url = ""
                if webfaf_installed():
                    problem_url = reverse("problems.item",
                                          problem_id=report.problem.id)

                attached_reports.append((problem_url, report.bugs))

            results.append((comp, count, attached_reports))

        if not results:
            return ""

        out = "Components:\n\n"

        for num, (comp, count, reports) in enumerate(results):
            if reports:
                out += ("{0}. {1} seen {2} times ({3:.0%} of all reports)\n".
                        format(num + 1, comp, count, count / float(total_num)))

                for problem_url, bugs in reports:
                    if problem_url or bugs:
                        out += "    {0} {1}\n".format(
                            problem_url, ", ".join(map(str, bugs)))

        return out
Example #2
0
def by_daterange(since, to):
    '''
    Render date-based report statistics including reports `since` date
    until `to` date.
    '''

    try:
        if isinstance(since, str) or isinstance(since, unicode):
            since = datetime.datetime.strptime(since, "%Y-%m-%d").date()

        if isinstance(to, str) or isinstance(to, unicode):
            to = datetime.datetime.strptime(to, "%Y-%m-%d").date()
    except:
        return abort(400)

    since = min(since, to)
    to = max(since, to)

    history = 'daily'
    day_count = (to - since).days
    if day_count > 30:
        history = 'weekly'
    if day_count > 360:
        history = 'monthly'

    def date_filter(query):
        return query.filter(hist_field >= since).filter(hist_field < to)

    hist_table, hist_field = queries.get_history_target(history)
    total_query = queries.get_history_sum(db, history=history)
    total = date_filter(total_query).one()[0]

    release_data = []

    for release in queries.get_releases(db):
        release_sum = queries.get_history_sum(db,
                                              release.opsys.name,
                                              release.version,
                                              history=history)

        release_sum = date_filter(release_sum).one()[0]
        if not release_sum:
            continue

        percentage = int(release_sum * 100.0 / total)

        comps = queries.get_report_count_by_component(db,
                                                      release.opsys.name,
                                                      release.version,
                                                      history=history)

        comp_data = []
        for comp, count in date_filter(comps).all():
            comp_percentage = int(count * 100.0 / release_sum)
            comp_data.append((comp, count, comp_percentage))

        release_data.append({
            'release': release,
            'sum': release_sum,
            'comps': comp_data,
            'percentage': percentage,
        })

    data = {
        'since': since,
        'to': to,
        'total': total,
        'releases': sorted(release_data, key=lambda x: x['sum'], reverse=True),
    }

    if request_wants_json():
        return jsonify(data)

    return render_template("stats/by_date.html", **data)
Example #3
0
def by_daterange(request,
                 since,
                 to,
                 template_name='stats/by_date.html',
                 extra_context={}):
    '''
    Render date-based report statistics including reports `since` date
    until `to` date.

    View accepts `template_name` to be used and `extra_context` to pass
    to it.
    '''

    if isinstance(since, str) or isinstance(since, unicode):
        since = datetime.datetime.strptime(since, "%Y-%m-%d").date()

    if isinstance(to, str) or isinstance(to, unicode):
        to = datetime.datetime.strptime(to, "%Y-%m-%d").date()

    db = pyfaf.storage.getDatabase()
    since = min(since, to)
    to = max(since, to)

    history = 'daily'
    day_count = (to - since).days
    if day_count > 30:
        history = 'weekly'
    if day_count > 360:
        history = 'monthly'

    def date_filter(query):
        return query.filter(hist_field >= since).filter(hist_field < to)

    hist_table, hist_field = queries.get_history_target(history)
    total_query = queries.get_history_sum(db, history=history)
    total = date_filter(total_query).one()[0]

    release_data = []

    for release in queries.get_releases(db):
        release_sum = queries.get_history_sum(db,
                                              release.opsys.name,
                                              release.version,
                                              history=history)

        release_sum = date_filter(release_sum).one()[0]
        if not release_sum:
            continue

        percentage = int(release_sum * 100.0 / total)

        comps = queries.get_report_count_by_component(db,
                                                      release.opsys.name,
                                                      release.version,
                                                      history=history)

        comp_data = []
        for comp, count in date_filter(comps).all():
            comp_percentage = int(count * 100.0 / release_sum)
            comp_data.append((comp, count, comp_percentage))

        release_data.append({
            'release': release,
            'sum': release_sum,
            'comps': comp_data,
            'percentage': percentage,
        })

    data = {
        'since': since,
        'to': to,
        'total': total,
        'releases': sorted(release_data, key=lambda x: x['sum'], reverse=True),
    }
    data.update(extra_context)

    if "application/json" in request.META.get("HTTP_ACCEPT"):
        return HttpResponse(json.dumps(data, cls=WebfafJSONEncoder),
                            status=200,
                            mimetype="application/json")
    else:
        return render_to_response(template_name,
                                  data,
                                  context_instance=RequestContext(request))
Example #4
0
    def components(self, cmdline, db, opsys, release):
        """
        Get statistics for most crashing components
        """

        hist_table, hist_field = get_history_target(self.history_type)
        total = get_history_sum(db, opsys, release)
        comps = get_report_count_by_component(db, opsys, release)

        if cmdline.last:
            now = datetime.datetime.now()
            since = now - datetime.timedelta(days=int(cmdline.last))
            comps = comps.filter(hist_field >= since)
            total = total.filter(hist_field >= since)

        total_num = total.first()[0]

        limit = int(cmdline.count)
        limit_details = int(cmdline.detail_count)
        results = []

        for num, (comp, count) in enumerate(comps):
            if num >= limit:
                break

            if comp in self.comps_filter:
                continue

            reports = get_report_stats_by_component(db, comp, opsys,
                                                    release,
                                                    self.history_type)

            if cmdline.last:
                reports = reports.filter(hist_field >= since)

            problem_ids = set()
            attached_reports = []

            for report, report_count in reports:
                if len(problem_ids) >= limit_details:
                    break
                if not report.problem:
                    continue
                if report.problem.id in problem_ids:
                    continue
                if report.quality < 0 and not cmdline.include_low_quality:
                    continue

                problem_ids.add(report.problem.id)

                problem_url = ""
                if webfaf_installed():
                    problem_url = reverse("problems.item",
                                          problem_id=report.problem.id)

                attached_reports.append((problem_url, report.bugs))

            results.append((comp, count, attached_reports))

        if not results:
            return ""

        out = "Components:\n\n"

        for num, (comp, count, reports) in enumerate(results):
            if reports:
                out += ("{0}. {1} seen {2} times ({3:.0%} of all reports)\n"
                        .format(num + 1, comp, count, count / float(total_num)))

                for problem_url, bugs in reports:
                    if problem_url or bugs:
                        out += "    {0} {1}\n".format(
                            problem_url, ", ".join(map(str, bugs)))

        return out
Example #5
0
File: stats.py Project: sorki/faf
def by_daterange(since, to):
    """
    Render date-based report statistics including reports `since` date
    until `to` date.
    """

    try:
        if isinstance(since, str) or isinstance(since, unicode):
            since = datetime.datetime.strptime(since, "%Y-%m-%d").date()

        if isinstance(to, str) or isinstance(to, unicode):
            to = datetime.datetime.strptime(to, "%Y-%m-%d").date()
    except:
        return abort(400)

    since = min(since, to)
    to = max(since, to)

    history = "daily"
    day_count = (to - since).days
    if day_count > 30:
        history = "weekly"
    if day_count > 360:
        history = "monthly"

    def date_filter(query):
        return query.filter(hist_field >= since).filter(hist_field < to)

    hist_table, hist_field = queries.get_history_target(history)
    total_query = queries.get_history_sum(db, history=history)
    total = date_filter(total_query).one()[0]

    release_data = []

    for release in queries.get_releases(db):
        release_sum = queries.get_history_sum(db, release.opsys.name, release.version, history=history)

        release_sum = date_filter(release_sum).one()[0]
        if not release_sum:
            continue

        percentage = int(release_sum * 100.0 / total)

        comps = queries.get_report_count_by_component(db, release.opsys.name, release.version, history=history)

        comp_data = []
        for comp, count in date_filter(comps).all():
            comp_percentage = int(count * 100.0 / release_sum)
            comp_data.append((comp, count, comp_percentage))

        release_data.append({"release": release, "sum": release_sum, "comps": comp_data, "percentage": percentage})

    data = {
        "since": since,
        "to": to,
        "total": total,
        "releases": sorted(release_data, key=lambda x: x["sum"], reverse=True),
    }

    if request_wants_json():
        return jsonify(data)

    return render_template("stats/by_date.html", **data)
Example #6
0
def by_daterange(request, since, to,
                 template_name='stats/by_date.html',
                 extra_context={}):
    '''
    Render date-based report statistics including reports `since` date
    until `to` date.

    View accepts `template_name` to be used and `extra_context` to pass
    to it.
    '''

    if isinstance(since, str) or isinstance(since, unicode):
        since = datetime.datetime.strptime(since, "%Y-%m-%d").date()

    if isinstance(to, str) or isinstance(to, unicode):
        to = datetime.datetime.strptime(to, "%Y-%m-%d").date()

    db = pyfaf.storage.getDatabase()
    since = min(since, to)
    to = max(since, to)

    history = 'daily'
    day_count = (to - since).days
    if day_count > 30:
        history = 'weekly'
    if day_count > 360:
        history = 'monthly'

    def date_filter(query):
        return query.filter(hist_field >= since).filter(hist_field < to)

    hist_table, hist_field = queries.get_history_target(history)
    total_query = queries.get_history_sum(db, history=history)
    total = date_filter(total_query).one()[0]

    release_data = []

    for release in queries.get_releases(db):
        release_sum = queries.get_history_sum(
            db, release.opsys.name, release.version, history=history)

        release_sum = date_filter(release_sum).one()[0]
        if not release_sum:
            continue

        percentage = int(release_sum * 100.0 / total)

        comps = queries.get_report_count_by_component(
            db, release.opsys.name, release.version, history=history)

        comp_data = []
        for comp, count in date_filter(comps).all():
            comp_percentage = int(count * 100.0 / release_sum)
            comp_data.append((comp, count, comp_percentage))

        release_data.append({
            'release': release,
            'sum': release_sum,
            'comps': comp_data,
            'percentage': percentage,
        })

    data = {
        'since': since,
        'to': to,
        'total': total,
        'releases': sorted(release_data, key=lambda x: x['sum'], reverse=True),
    }
    data.update(extra_context)

    if "application/json" in request.META.get("HTTP_ACCEPT"):
        return HttpResponse(json.dumps(data, cls=WebfafJSONEncoder),
                            status=200, mimetype="application/json")
    else:
        return render_to_response(template_name,
                                  data,
                                  context_instance=RequestContext(request))
Example #7
0
File: stats.py Project: abrt/faf
def by_daterange(since, to):
    '''
    Render date-based report statistics including reports `since` date
    until `to` date.
    '''

    try:
        if isinstance(since, str):
            since = datetime.datetime.strptime(since, "%Y-%m-%d").date()

        if isinstance(to, str):
            to = datetime.datetime.strptime(to, "%Y-%m-%d").date()
    except: # pylint: disable=bare-except
        return abort(400)

    since = min(since, to)
    to = max(since, to)

    history = 'daily'
    day_count = (to - since).days
    if day_count > 30:
        history = 'weekly'
    if day_count > 360:
        history = 'monthly'

    def date_filter(query):
        return query.filter(hist_field >= since).filter(hist_field < to)

    _, hist_field = queries.get_history_target(history)
    total_query = queries.get_history_sum(db, history=history)
    total = date_filter(total_query).one()[0]

    release_data = []

    for release in queries.get_releases(db):
        release_sum = queries.get_history_sum(
            db, release.opsys.name, release.version, history=history)

        release_sum = date_filter(release_sum).one()[0]
        if not release_sum:
            continue

        percentage = int(release_sum * 100.0 / total)

        comps = queries.get_report_count_by_component(
            db, release.opsys.name, release.version, history=history)

        comp_data = []
        for comp, count in date_filter(comps).all():
            comp_percentage = int(count * 100.0 / release_sum)
            comp_data.append((comp, count, comp_percentage))

        release_data.append({
            'release': release,
            'sum': release_sum,
            'comps': comp_data,
            'percentage': percentage,
        })

    data = {
        'since': since,
        'to': to,
        'total': total,
        'releases': sorted(release_data, key=lambda x: x['sum'], reverse=True),
    }

    if request_wants_json():
        return jsonify(data)

    return render_template("stats/by_date.html", **data)