Chromium Code Reviews| Index: appengine/findit/handlers/crash/fracas_result_feedback.py |
| diff --git a/appengine/findit/handlers/crash/fracas_result_feedback.py b/appengine/findit/handlers/crash/fracas_result_feedback.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a07263387f321f87f560fe36d2362284f9531247 |
| --- /dev/null |
| +++ b/appengine/findit/handlers/crash/fracas_result_feedback.py |
| @@ -0,0 +1,76 @@ |
| +# Copyright 2014 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +import base64 |
| +from collections import defaultdict |
| +import copy |
| +from datetime import datetime |
| +import json |
| +import os |
| + |
| +from google.appengine.ext import ndb |
| +from google.appengine.api import users |
| + |
| +from common import constants |
| +from common import time_util |
| +from common.base_handler import BaseHandler |
| +from common.base_handler import Permission |
| +from handlers import handlers_util |
| +from handlers import result_status |
| +from handlers.result_status import NO_TRY_JOB_REASON_MAP |
| +from model.crash.fracas_crash_analysis import FracasCrashAnalysis |
| +from model import triage_status |
| + |
| + |
| +class FracasResultFeedback(BaseHandler): |
| + PERMISSION_LEVEL = Permission.ANYONE |
| + |
| + def _GetCrashDataFromAnalysis(self, analysis): |
|
Martin Barbella
2016/06/17 22:14:32
Could this be useful anywhere else? Would it make
Sharu Jiang
2016/06/17 23:58:22
Done.
|
| + return { |
| + 'signature': analysis.signature, |
| + 'version': analysis.crashed_version, |
| + 'channel': analysis.channel, |
| + 'platform': analysis.platform, |
| + 'regression_range': ( |
| + analysis.result['regression_range'] if 'regression_range' in |
| + analysis.result else None), |
| + 'historical_metadata': analysis.historical_metadata, |
| + 'stack_trace': analysis.stack_trace, |
| + 'suspected_cls': ( |
| + analysis.result['suspected_cls'] if 'suspected_cls' in |
| + analysis.result else None), |
| + 'suspected_project': ( |
| + analysis.result['suspected_project'] if 'suspected_project' in |
| + analysis.result else None), |
| + 'suspected_components': ( |
| + analysis.result['suspected_components'] if 'suspected_components' |
| + in analysis.result else None), |
| + 'request_time': time_util.FormatDatetime(analysis.requested_time), |
| + 'analysis_completed': analysis.completed, |
| + 'analysis_failed': analysis.failed, |
| + } |
| + |
| + def HandleGet(self): |
| + """Triggers analysis of a build failure on demand and return current result. |
| + |
| + If the final analysis result is available, set cache-control to 1 day to |
| + avoid overload by unnecessary and frequent query from clients; otherwise |
| + set cache-control to 5 seconds to allow repeated query. |
| + |
| + Serve HTML page or JSON result as requested. |
| + """ |
| + key = ndb.Key(urlsafe=self.request.get('key')) |
| + |
| + analysis = key.get() |
| + if not analysis: # pragma: no cover. |
| + return BaseHandler.CreateError( |
| + 'cannot find analysis for crash %s' % analysis.signature) |
| + |
| + return { |
| + 'template': 'crash/fracas_result_feedback.html', |
| + 'data': self._GetCrashDataFromAnalysis(analysis), |
| + } |
| + |
| + def HandlePost(self): # pragma: no cover |
| + return self.HandleGet() |