Example #1
0
def treemap_data(session, request):
    '''
    Dumps data that represents the system state at some point in time. Currently it dumps the latest snapshot of the
    system for continuous metrics and data over the past x months for discontinous metrics.

    QueryDict params:
        cmp_type (str):         The type of component for which child data is gathered. E.g if a subsystem is provided,
                                the returned data is all data for the files in that subsystem.
        cmp_id (int):           The component id.
        metric (str):           A metric that must exist in the global METRICS dict.
        response_type (str):    "application/json"|"text/csv"
    '''
    metric = request.GET['metric']
    cmp_type = request.GET['type']
    cmp_id = request.GET.get('id')
    response_type = request.GET.get("response_type", "application/json")

    if metric not in METRICS.keys():
        return HttpResponseNotFound("<h3>Metric not found</h3>")

    query = MetricsDb_TreemapData.get_query(session, metric, cmp_type, cmp_id)
    data = [views_utils.get_query_columns(query)] + query.all()
    return views_utils.dump_data(data,
                                 response_type,
                                 filename="treemap_data_" + metric)
Example #2
0
def get_subsystems(session, request):
    '''
    Returns all subsystems as an array of [subsystem_id, subsystem]
    '''
    response_type = request.GET.get("response_type", "application/json")

    query = session.query(Subsystem.id, Subsystem.subsystem).order_by(Subsystem.id)

    columns = views_utils.get_query_columns(query)
    data = [columns] + query.all()
    return views_utils.dump_data(data, response_type, filename="subsystems")
Example #3
0
def files(session, _, formating='json'):
    '''
    Returns an array of all files and file_id:s
    See docs/frontends/django_implementation.md for a more detailed description of the format

    Args:
        session(sqlalchemy session): session to use for queries
        formating(str):    Indicates wich format that should be returned, [json|csv]
    '''
    query = session.query(File.subsystem_id, File.id, File.file).order_by(File.file)
    return views_utils.dump_data([views_utils.get_query_columns(query)] + query.all(),
                                 response_type=formating, filename=files.__name__)
Example #4
0
def get_functions_for_file(session, request):
    '''
    Returns all functions for a file as an array of [function_id, function]
    '''
    response_type = request.GET.get("response_type", "application/json")
    file_id = request.GET['id']

    query = session.query(Function.id, Function.function).filter(Function.file_id == file_id).order_by(Function.id)

    columns = views_utils.get_query_columns(query)
    data = [columns] + query.all()
    return views_utils.dump_data(data, response_type, filename="functions")
Example #5
0
def get_files_for_subsystem(session, request):
    '''
    Returns all files for a subsystem as an array of [file_id, file]
    '''
    response_type = request.GET.get("response_type", "application/json")
    subsystem_id = request.GET['id']

    query = session.query(File.id, File.file).filter(File.subsystem_id == subsystem_id).order_by(File.id)

    columns = views_utils.get_query_columns(query)
    data = [columns] + query.all()
    return views_utils.dump_data(data, response_type, filename="files")
Example #6
0
def get_subsystems(session, request):
    '''
    Returns all subsystems as an array of [subsystem_id, subsystem]
    '''
    response_type = request.GET.get("response_type", "application/json")

    query = session.query(Subsystem.id,
                          Subsystem.subsystem).order_by(Subsystem.id)

    columns = views_utils.get_query_columns(query)
    data = [columns] + query.all()
    return views_utils.dump_data(data, response_type, filename="subsystems")
Example #7
0
def get_functions_for_file(session, request):
    '''
    Returns all functions for a file as an array of [function_id, function]
    '''
    response_type = request.GET.get("response_type", "application/json")
    file_id = request.GET['id']

    query = session.query(Function.id, Function.function).filter(
        Function.file_id == file_id).order_by(Function.id)

    columns = views_utils.get_query_columns(query)
    data = [columns] + query.all()
    return views_utils.dump_data(data, response_type, filename="functions")
Example #8
0
def get_files_for_subsystem(session, request):
    '''
    Returns all files for a subsystem as an array of [file_id, file]
    '''
    response_type = request.GET.get("response_type", "application/json")
    subsystem_id = request.GET['id']

    query = session.query(
        File.id,
        File.file).filter(File.subsystem_id == subsystem_id).order_by(File.id)

    columns = views_utils.get_query_columns(query)
    data = [columns] + query.all()
    return views_utils.dump_data(data, response_type, filename="files")
Example #9
0
def treemap_data(session, request):
    '''
    Dumps data that represents the system state at some point in time. Currently it dumps the latest snapshot of the
    system for continuous metrics and data over the past x months for discontinous metrics.

    QueryDict params:
        cmp_type (str):         The type of component for which child data is gathered. E.g if a subsystem is provided,
                                the returned data is all data for the files in that subsystem.
        cmp_id (int):           The component id.
        metric (str):           A metric that must exist in the global METRICS dict.
        response_type (str):    "application/json"|"text/csv"
    '''
    metric = request.GET['metric']
    cmp_type = request.GET['type']
    cmp_id = request.GET.get('id')
    response_type = request.GET.get("response_type", "application/json")

    if metric not in METRICS.keys():
        return HttpResponseNotFound("<h3>Metric not found</h3>")

    query = MetricsDb_TreemapData.get_query(session, metric, cmp_type, cmp_id)
    data = [views_utils.get_query_columns(query)] + query.all()
    return views_utils.dump_data(data, response_type, filename="treemap_data_" + metric)
Example #10
0
def contributors_defects_data(session, request):
    """
    Returns the contributors and defects for all the files between two dates.

    QueryDict params:
        response_type (str)             'application/json'|'text/csv', default='application/json'
        startdate (json date format)    As per ISO 8601, default=datetime.fromtimestamp(0)
        enddate (json date format)      As per ISO 8601, default=datetime.now()

    Args:
        request (django.http.HttpRequest)

    Returns:
        django.http.HttpResponse
    """
    response_type = request.GET.get("response_type", "application/json")
    startdate = views_utils.str2datetime(request.GET.get('startdate', datetime.fromtimestamp(0).isoformat()))
    enddate = views_utils.str2datetime(request.GET.get('enddate', datetime.now().isoformat()))

    # Pylint incorrectly identifies start/enddate as possible tuples (str2datetime makes sure that is not possible)
    # plus this code is specifically tested in a unittest so its safe.
    filename = "contributors_defects_files_" + startdate.strftime("%Y%m%d") + "-" + enddate.strftime("%Y%m%d")  # pylint: disable=E1101, C0301

    cm1 = aliased(ChangeMetric)
    cm2 = aliased(ChangeMetric)
    cm_metrics = session.query(cm1.file_id,
                               MetricsDb_TreemapData.replace_null_0(func.sum(cm1.nloc)).label("nloc"),
                               MetricsDb_TreemapData.replace_null_0(func.sum(cm1.cyclomatic_complexity))\
                               .label("cyclomatic_complexity"))\
                               .outerjoin(cm2, and_(cm1.function_id == cm2.function_id, cm1.date < cm2.date))\
                               .filter(cm2.date.is_(None))\
                               .group_by(cm1.file_id)\
                               .subquery()

    cm_contributors = session.query(ChangeMetric.file_id,
                                    func.count(distinct(ChangeMetric.user_id)).label('contributors'))\
                                    .filter(ChangeMetric.date.between(startdate, enddate))\
                                    .group_by(ChangeMetric.file_id)\
                                    .subquery()

    defect_mods = session.query(DefectModification.file_id,
                                func.count(distinct(DefectModification.user_id)).label('contributors'),
                                func.count(distinct(DefectModification.defect_id)).label('defects'))\
                                .join(DefectMeta, DefectMeta.id == DefectModification.defect_id)\
                                .filter(DefectModification.date.between(startdate, enddate))\
                                .group_by(DefectModification.file_id)

    defects_a = defect_mods.filter(DefectMeta.severity == 'A').subquery()
    defects_b = defect_mods.filter(DefectMeta.severity == 'B').subquery()
    defects_c = defect_mods.filter(DefectMeta.severity == 'C').subquery()
    defects_improvement = defect_mods.filter(DefectMeta.severity == 'Improvement').subquery()
    defect_mods = defect_mods.subquery()

    # Note, we are only retrieveing files with a subsystem with an inner join
    query = session.query(File.subsystem_id,
                          File.id,
                          File.file,
                          Subsystem.subsystem,
                          MetricsDb_TreemapData.replace_null_0(cm_contributors.c.contributors).label("contributors_cm"),
                          MetricsDb_TreemapData.replace_null_0(defect_mods.c.contributors).label("contributors_tr"),
                          MetricsDb_TreemapData.replace_null_0(defect_mods.c.defects).label("defects"),
                          MetricsDb_TreemapData.replace_null_0(defects_a.c.defects).label("defects_a"),
                          MetricsDb_TreemapData.replace_null_0(defects_b.c.defects).label("defects_b"),
                          MetricsDb_TreemapData.replace_null_0(defects_c.c.defects).label("defects_c"),
                          MetricsDb_TreemapData.replace_null_0(defects_improvement.c.defects)\
                          .label("defects_improvement"),
                          MetricsDb_TreemapData.replace_null_0(cm_metrics.c.cyclomatic_complexity)\
                          .label("cyclomatic_complexity"),
                          MetricsDb_TreemapData.replace_null_0(cm_metrics.c.nloc).label("nloc"))\
                                .join(Subsystem, File.subsystem_id == Subsystem.id)\
                                .outerjoin(cm_metrics, cm_metrics.c.file_id == File.id)\
                                .outerjoin(cm_contributors, cm_contributors.c.file_id == File.id)\
                                .outerjoin(defect_mods, defect_mods.c.file_id == File.id)\
                                .outerjoin(defects_a, defects_a.c.file_id == File.id)\
                                .outerjoin(defects_b, defects_b.c.file_id == File.id)\
                                .outerjoin(defects_c, defects_c.c.file_id == File.id)\
                                .outerjoin(defects_improvement, defects_improvement.c.file_id == File.id)\
                                .order_by(File.id)

    data = [views_utils.get_query_columns(query)] + query.all()
    return views_utils.dump_data(data, response_type, filename=filename)
Example #11
0
def contributors_defects_data(session, request):
    """
    Returns the contributors and defects for all the files between two dates.

    QueryDict params:
        response_type (str)             'application/json'|'text/csv', default='application/json'
        startdate (json date format)    As per ISO 8601, default=datetime.fromtimestamp(0)
        enddate (json date format)      As per ISO 8601, default=datetime.now()

    Args:
        request (django.http.HttpRequest)

    Returns:
        django.http.HttpResponse
    """
    response_type = request.GET.get("response_type", "application/json")
    startdate = views_utils.str2datetime(
        request.GET.get('startdate',
                        datetime.fromtimestamp(0).isoformat()))
    enddate = views_utils.str2datetime(
        request.GET.get('enddate',
                        datetime.now().isoformat()))

    # Pylint incorrectly identifies start/enddate as possible tuples (str2datetime makes sure that is not possible)
    # plus this code is specifically tested in a unittest so its safe.
    filename = "contributors_defects_files_" + startdate.strftime(
        "%Y%m%d") + "-" + enddate.strftime("%Y%m%d")  # pylint: disable=E1101, C0301

    cm1 = aliased(ChangeMetric)
    cm2 = aliased(ChangeMetric)
    cm_metrics = session.query(cm1.file_id,
                               MetricsDb_TreemapData.replace_null_0(func.sum(cm1.nloc)).label("nloc"),
                               MetricsDb_TreemapData.replace_null_0(func.sum(cm1.cyclomatic_complexity))\
                               .label("cyclomatic_complexity"))\
                               .outerjoin(cm2, and_(cm1.function_id == cm2.function_id, cm1.date < cm2.date))\
                               .filter(cm2.date.is_(None))\
                               .group_by(cm1.file_id)\
                               .subquery()

    cm_contributors = session.query(ChangeMetric.file_id,
                                    func.count(distinct(ChangeMetric.user_id)).label('contributors'))\
                                    .filter(ChangeMetric.date.between(startdate, enddate))\
                                    .group_by(ChangeMetric.file_id)\
                                    .subquery()

    defect_mods = session.query(DefectModification.file_id,
                                func.count(distinct(DefectModification.user_id)).label('contributors'),
                                func.count(distinct(DefectModification.defect_id)).label('defects'))\
                                .join(DefectMeta, DefectMeta.id == DefectModification.defect_id)\
                                .filter(DefectModification.date.between(startdate, enddate))\
                                .group_by(DefectModification.file_id)

    defects_a = defect_mods.filter(DefectMeta.severity == 'A').subquery()
    defects_b = defect_mods.filter(DefectMeta.severity == 'B').subquery()
    defects_c = defect_mods.filter(DefectMeta.severity == 'C').subquery()
    defects_improvement = defect_mods.filter(
        DefectMeta.severity == 'Improvement').subquery()
    defect_mods = defect_mods.subquery()

    # Note, we are only retrieveing files with a subsystem with an inner join
    query = session.query(File.subsystem_id,
                          File.id,
                          File.file,
                          Subsystem.subsystem,
                          MetricsDb_TreemapData.replace_null_0(cm_contributors.c.contributors).label("contributors_cm"),
                          MetricsDb_TreemapData.replace_null_0(defect_mods.c.contributors).label("contributors_tr"),
                          MetricsDb_TreemapData.replace_null_0(defect_mods.c.defects).label("defects"),
                          MetricsDb_TreemapData.replace_null_0(defects_a.c.defects).label("defects_a"),
                          MetricsDb_TreemapData.replace_null_0(defects_b.c.defects).label("defects_b"),
                          MetricsDb_TreemapData.replace_null_0(defects_c.c.defects).label("defects_c"),
                          MetricsDb_TreemapData.replace_null_0(defects_improvement.c.defects)\
                          .label("defects_improvement"),
                          MetricsDb_TreemapData.replace_null_0(cm_metrics.c.cyclomatic_complexity)\
                          .label("cyclomatic_complexity"),
                          MetricsDb_TreemapData.replace_null_0(cm_metrics.c.nloc).label("nloc"))\
                                .join(Subsystem, File.subsystem_id == Subsystem.id)\
                                .outerjoin(cm_metrics, cm_metrics.c.file_id == File.id)\
                                .outerjoin(cm_contributors, cm_contributors.c.file_id == File.id)\
                                .outerjoin(defect_mods, defect_mods.c.file_id == File.id)\
                                .outerjoin(defects_a, defects_a.c.file_id == File.id)\
                                .outerjoin(defects_b, defects_b.c.file_id == File.id)\
                                .outerjoin(defects_c, defects_c.c.file_id == File.id)\
                                .outerjoin(defects_improvement, defects_improvement.c.file_id == File.id)\
                                .order_by(File.id)

    data = [views_utils.get_query_columns(query)] + query.all()
    return views_utils.dump_data(data, response_type, filename=filename)