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())
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))