def failure_lines(self, request, project, jm, pk=None): """ Get a list of test failure lines for the job """ job = jm.get_job(pk) if job: queryset = FailureLine.objects.filter( job_guid=job[0]['job_guid'] ).prefetch_related( "matches", "matches__matcher" ) failure_lines = [serializers.FailureLineNoStackSerializer(obj).data for obj in queryset] return Response(failure_lines) return Response("No job with id: {0}".format(pk), status=HTTP_404_NOT_FOUND)
def failure_lines(self, request, project, pk=None): """ Get a list of test failure lines for the job """ try: job = Job.objects.get(repository__name=project, id=pk) queryset = FailureLine.objects.filter( job_guid=job.guid).prefetch_related( "matches", "matches__matcher" ) failure_lines = [serializers.FailureLineNoStackSerializer(obj).data for obj in queryset] return Response(failure_lines) except ObjectDoesNotExist: return Response("No job with id: {0}".format(pk), status=HTTP_404_NOT_FOUND)
def _update(self, data, user, many=True): by_project = defaultdict(list) ids = [] failure_line_ids = set() classification_ids = set() for item in data: line_id = int(item.get("id")) if line_id is None: return "No failure line id provided", HTTP_400_BAD_REQUEST failure_line_ids.add(line_id) if "best_classification" not in item: return "No classification id provided", HTTP_400_BAD_REQUEST classification_id = item.get("best_classification") if classification_id is not None: classification_ids.add(classification_id) ids.append((line_id, classification_id)) failure_lines = as_dict( FailureLine.objects.prefetch_related('classified_failures').filter( id__in=failure_line_ids), "id") if len(failure_lines) != len(failure_line_ids): missing = failure_line_ids - set(failure_lines.keys()) return ("No failure line with id: {0}".format(", ".join(missing)), HTTP_404_NOT_FOUND) classifications = as_dict( ClassifiedFailure.objects.filter(id__in=classification_ids), "id") if len(classifications) != len(classification_ids): missing = classification_ids - set(classifications.keys()) return ("No classification with id: {0}".format( ", ".join(missing)), HTTP_404_NOT_FOUND) for line_id, classification_id in ids: failure_line = failure_lines[line_id] if classification_id is not None: classification = classifications[classification_id] else: classification = None by_project[failure_line.repository.name].append( failure_line.job_guid) failure_line.mark_best_classification_verified(classification) for project, job_guids in iteritems(by_project): for job in Job.objects.filter(guid__in=job_guids): job.update_after_verification(user) # Force failure line to be reloaded, including .classified_failures rv = FailureLine.objects.prefetch_related( 'classified_failures').filter(id__in=failure_line_ids) if not many: rv = rv[0] return (serializers.FailureLineNoStackSerializer(rv, many=many).data, HTTP_200_OK)
def _update(self, data, email, many=True): by_project = defaultdict(list) ids = [] failure_line_ids = set() classification_ids = set() for item in data: line_id = int(item.get("id")) if line_id is None: return "No failure line id provided", 400 failure_line_ids.add(line_id) if "best_classification" not in item: return "No classification id provided", 400 classification_id = item.get("best_classification") if classification_id is not None: classification_ids.add(classification_id) ids.append((line_id, classification_id)) failure_lines = as_dict( FailureLine.objects.prefetch_related('classified_failures').filter( id__in=failure_line_ids), "id") if len(failure_lines) != len(failure_line_ids): missing = failure_line_ids - set(failure_lines.keys()) return "No failure line with id: {0}".format( ", ".join(missing)), 404 classifications = as_dict( ClassifiedFailure.objects.filter(id__in=classification_ids), "id") if len(classifications) != len(classification_ids): missing = classification_ids - set(classifications.keys()) return "No classification with id: {0}".format( ", ".join(missing)), 404 for line_id, classification_id in ids: failure_line = failure_lines[line_id] if classification_id is not None: classification = classifications[classification_id] else: classification = None by_project[failure_line.repository.name].append( failure_line.job_guid) failure_line.best_classification = classification failure_line.best_is_verified = True failure_line.save() if (classification is not None and classification not in failure_line.classified_failures.all()): manual_detector = Matcher.objects.get(name="ManualDetector") match = FailureMatch(failure_line=failure_line, classified_failure=classification, matcher=manual_detector, score=1.0) match.save() for project, job_guids in by_project.iteritems(): with JobsModel(project) as jm: jobs = jm.get_job_ids_by_guid(job_guids) for job in jobs.values(): jm.update_after_verification(job["id"], email) # Force failure line to be reloaded, including .classified_failures rv = FailureLine.objects.prefetch_related( 'classified_failures').filter(id__in=failure_line_ids) if not many: rv = rv[0] return serializers.FailureLineNoStackSerializer(rv, many=many).data, 200