def response_view(request, responseid, template): response = get_object_or_404(Response, id=responseid) try: prod = Product.objects.get(db_name=response.product) if (not prod.on_dashboard and (not request.user.is_authenticated() or not request.user.has_perm( 'analytics.can_view_dashboard'))): # If this is a response for a hidden product and the user # isn't in the analytics group, then they can't see it. return HttpResponseForbidden() except Product.DoesNotExist: pass mlt = None records = None errors = [] if (request.user.is_authenticated() and request.user.has_perm('analytics.can_view_dashboard')): try: # Convert it to a list to force it to execute right now. mlt = ResponseMappingType.reshape( ResponseMappingType.morelikethis(response)) except ElasticsearchException as exc: errors.append('Failed to do morelikethis: %s' % exc) records = [ (u'Response records', Record.objects.records(response)), ] jobs = GengoJob.objects.filter( object_id=response.id, content_type=ContentType.objects.get_for_model(response) ) for job in jobs: records.append( (u'Gengo job record {0}'.format(job.id), job.records) ) # We don't pass the response directly to the template and instead # do some data tweaks here to make it more palatable for viewing. return render(request, template, { 'errors': errors, 'response': response, 'mlt': mlt, 'records': records, })
def analytics_duplicates(request): """Shows all duplicate descriptions over the last n days""" template = 'analytics/analyzer/duplicates.html' n = 14 responses = (ResponseMappingType.search() .filter(created__gte=datetime.now() - timedelta(days=n)) .values_dict('description', 'happy', 'created', 'locale', 'user_agent', 'id') .order_by('created').everything()) responses = ResponseMappingType.reshape(responses) total_count = len(responses) response_dupes = {} for resp in responses: response_dupes.setdefault(resp['description'], []).append(resp) response_dupes = [ (key, val) for key, val in response_dupes.items() if len(val) > 1 ] # convert the dict into a list of tuples sorted by the number of # responses per tuple largest number first response_dupes = sorted(response_dupes, key=lambda item: len(item[1]) * -1) # duplicate_count -> count # i.e. "how many responses had 2 duplicates?" summary_counts = defaultdict(int) for desc, responses in response_dupes: summary_counts[len(responses)] = summary_counts[len(responses)] + 1 summary_counts = sorted(summary_counts.items(), key=lambda item: item[0]) return render(request, template, { 'n': 14, 'response_dupes': response_dupes, 'render_time': datetime.now(), 'summary_counts': summary_counts, 'total_count': total_count, })
def analytics_duplicates(request): """Shows all duplicate descriptions over the last n days""" template = 'analytics/analyzer/duplicates.html' n = 14 responses = (ResponseMappingType.search().filter( created__gte=datetime.now() - timedelta(days=n)).values_dict( 'description', 'happy', 'created', 'locale', 'user_agent', 'id').order_by('created').everything()) responses = ResponseMappingType.reshape(responses) total_count = len(responses) response_dupes = {} for resp in responses: response_dupes.setdefault(resp['description'], []).append(resp) response_dupes = [(key, val) for key, val in response_dupes.items() if len(val) > 1] # convert the dict into a list of tuples sorted by the number of # responses per tuple largest number first response_dupes = sorted(response_dupes, key=lambda item: len(item[1]) * -1) # duplicate_count -> count # i.e. "how many responses had 2 duplicates?" summary_counts = defaultdict(int) for desc, responses in response_dupes: summary_counts[len(responses)] = summary_counts[len(responses)] + 1 summary_counts = sorted(summary_counts.items(), key=lambda item: item[0]) return render( request, template, { 'n': 14, 'response_dupes': response_dupes, 'render_time': datetime.now(), 'summary_counts': summary_counts, 'total_count': total_count, })
def response_view(request, responseid, template): response = get_object_or_404(Response, id=responseid) mlt = None records = None errors = [] if (request.user.is_authenticated() and request.user.has_perm('analytics.can_view_dashboard')): try: # Convert it to a list to force it to execute right now. mlt = ResponseMappingType.reshape( ResponseMappingType.morelikethis(response)) except ElasticsearchException as exc: errors.append('Failed to do morelikethis: %s' % exc) records = [ (u'Response records', Record.objects.records(response)), ] jobs = GengoJob.objects.filter( object_id=response.id, content_type=ContentType.objects.get_for_model(response) ) for job in jobs: records.append( (u'Gengo job record {0}'.format(job.id), job.records) ) # We don't pass the response directly to the template and instead # do some data tweaks here to make it more palatable for viewing. return render(request, template, { 'errors': errors, 'response': response, 'mlt': mlt, 'records': records, })
def response_view(request, responseid, template): response = get_object_or_404(Response, id=responseid) mlt = None records = None errors = [] if (request.user.is_authenticated() and request.user.has_perm('analytics.can_view_dashboard')): try: # Convert it to a list to force it to execute right now. mlt = ResponseMappingType.reshape( ResponseMappingType.morelikethis(response)) except ElasticsearchException as exc: errors.append('Failed to do morelikethis: %s' % exc) records = [ (u'Response records', Record.objects.records(response)), ] jobs = GengoJob.objects.filter( object_id=response.id, content_type=ContentType.objects.get_for_model(response) ) for job in jobs: records.append( (u'Gengo job record {0}'.format(job.id), job.records) ) # We don't pass the response directly to the template and instead # do some data tweaks here to make it more palatable for viewing. return render(request, template, { 'errors': errors, 'response': response, 'mlt': mlt, 'records': records, })