Пример #1
0
    def test_note_error(self):
        '''We know when we have errors and can build error documents.'''
        validator = ApiValidator()
        self.assertEqual(False, validator.has_errors())

        validator.note_error("aaa")
        self.assertEqual(True, validator.has_errors())
        self.assertEqual([{
            "message": "aaa",
        }], validator.build_document())

        validator.note_error("bbb")
        self.assertEqual(True, validator.has_errors())
        self.assertEqual([{
            "message": "aaa",
        }, {
            "message": "bbb",
        }], validator.build_document())
Пример #2
0
def dynamic_chart(request):
    """
    return charting data given a set of filters, date range, and drilldown
    selection

    request
    {
        "date_start": "01/01/2016 00:00:00",
        "date_end": "01/08/2016 00:00:00",
        "active_filters": [{"type": "country", "value": "USA"},
                         {"type": "state", "value": "Indiana"}],
        "report": "found_on",
        "group_overwrite": "browser",
    }

    response
    {
        "column_names":
            [
                {"key": "browser", "label": "Browser"},
                {"key": "job_views", "label": "Job Views"},
             ],
        "rows":
            [
                {"browser": "Chrome", "job_views": "101",  "visits": "1050"},
                {"browser": "IE11", "job_views": "231", "visits": "841"},
                {"browser": "IE8", "job_views": "23", "visits": "341"},
                {"browser": "Firefox", "job_views": "21", "visits": "298"},
                {"browser": "Netscape Navigator", "job_views": "1", "visits": "1"},
                {"browser": "Dolphin", "job_views": "1", "visits": "1"}
             ]
    }


    """
    if request.method != 'POST':
        return HttpResponseNotAllowed(['POST'])

    validator = ApiValidator()

    query_data = json.loads(request.POST.get('request', '{}'))
    if not query_data:
        validator.note_error("No data provided.")

    if validator.has_errors():
        return validator.build_error_response()

    required_fields = ['date_end', 'date_start', 'report']
    for field in required_fields:
        if not query_data.get(field):
            validator.note_field_error(field, '%s is required' % field)

    if validator.has_errors():
        return validator.build_error_response()

    try:
        date_start = dateparser.parse(query_data['date_start'])
    except ValueError:
        validator.note_field_error('date_start',
                                   'Invalid date start: ' +
                                    query_data['date_end'])

    try:
        date_end = dateparser.parse(query_data['date_end'])
    except ValueError:
        validator.note_field_error('date_end',
                                   'Invalid date end: ' +
                                   query_data['date_end'])

    report_data = get_analytics_reporttype_datatype(query_data['report'])

    if not report_data:
        validator.note_field_error(
            "analytics_report_id", "No analytics report found.")

    if validator.has_errors():
        return validator.build_error_response()

    sample_size = 50000 # TODO: Add sample size to request object

    job_views = get_mongo_db().job_views

    buids = get_company_buids(request)

    top_query = build_top_query(date_start, date_end, buids)

    sample_query, total_count = retrieve_sampling_query_and_count(job_views,
                                                                  top_query,
                                                                  sample_size)

    if not sample_query:
        sample_size = total_count

    active_filter_query = build_active_filter_query(query_data)

    group_by, remaining_dimensions = determine_data_group_by_and_remaining(
        query_data, report_data
    )

    group_query = build_group_by_query(group_by.column_name)

    query = [
        {'$match': top_query},
    ] + sample_query + active_filter_query + group_query

    records = job_views.aggregate(query, allowDiskUse=True)

    if sample_query:
        def curried_query(count):
            return calculate_error_and_count(total_count, sample_size, count)

        records = adjust_records_for_sampling(records, curried_query)

    response = {
        "column_names":
            [
                {"key": group_by.column_name,
                 "label": group_by.filter_interface_display},
                {"key": "job_views", "label": "Job Views"},
                {"key": "visitors", "label": "Visitors"},
             ],
        "rows":
            [format_return_dict(r, group_by.column_name) for r in records],
        "chart_type": group_by.filter_interface_type,
        "group_by": group_by.column_name,
        "remaining_dimensions": [{"key": d.column_name,
                                  "label": d.filter_interface_display}
                                 for d in remaining_dimensions]
    }

    return HttpResponse(json.dumps(response))