Chromium Code Reviews| Index: appengine/findit/handlers/crash/fracas_dashboard.py |
| diff --git a/appengine/findit/handlers/crash/fracas_dashboard.py b/appengine/findit/handlers/crash/fracas_dashboard.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..66b8a099342be484ac3ff563f538c29f18bb2fd4 |
| --- /dev/null |
| +++ b/appengine/findit/handlers/crash/fracas_dashboard.py |
| @@ -0,0 +1,119 @@ |
| +# Copyright 2016 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 datetime import datetime |
| +from datetime import time |
| +from datetime import timedelta |
| +import json |
| + |
| +from google.appengine.ext import ndb |
| + |
| +from common import time_util |
| +from common.base_handler import BaseHandler |
| +from common.base_handler import Permission |
| +from model.crash.fracas_crash_analysis import FracasCrashAnalysis |
| +from model import triage_status |
| + |
| + |
| +_EQUAL_FILTER_TO_CONVERTER = { |
| + 'found_suspects': lambda x: bool(int(x)), |
| + 'has_regression_range': lambda x: bool(int(x)), |
| + 'suspected_cls_triage_status': lambda x: x, |
| + 'regression_range_triage_status': lambda x: x, |
| +} |
| + |
| +_DEFAULT_DISPLAY_COUNT = 500 |
| + |
| + |
| +class FracasDashBoard(BaseHandler): |
| + PERMISSION_LEVEL = Permission.ANYONE |
| + |
| + def HandleGet(self): |
| + """Shows a list of Findit try job results and statuses in an HTML page.""" |
|
stgao
2016/06/08 17:53:45
This is not updated. This one is for crash, not fo
Sharu Jiang
2016/06/09 06:13:28
Oops, changed it.
|
| + midnight_today = datetime.combine(datetime.utcnow(), time.min) |
| + midnight_yesterday = midnight_today - timedelta(days=1) |
| + midnight_tomorrow = midnight_today + timedelta(days=1) |
| + |
| + start = self.request.get('start_date') |
| + end = self.request.get('end_date') |
| + start_date = (datetime.strptime(start, '%Y-%m-%d') if start else |
| + midnight_yesterday) |
| + end_date = (datetime.strptime(end, '%Y-%m-%d') if end else |
| + midnight_tomorrow) |
| + |
| + if start or not end: # pragma: no branch |
| + # If a start date is specified, get everything since then. |
| + filters = [ |
| + FracasCrashAnalysis.requested_time >= start_date, |
| + FracasCrashAnalysis.requested_time < end_date |
| + ] |
| + else: # pragma: no cover |
| + # If no start date specified, then get everything up until end_date. |
| + start_date = None |
| + filters = [ |
| + FracasCrashAnalysis.requested_time < end_date |
| + ] |
| + |
| + for equal_filter, converter in _EQUAL_FILTER_TO_CONVERTER.iteritems(): |
| + if self.request.get(equal_filter, None) is None: |
| + continue |
| + |
| + value = converter(self.request.get(equal_filter)) |
| + if value == triage_status.TRIAGED: |
| + filters.append(ndb.OR( |
| + getattr(FracasCrashAnalysis, equal_filter) == |
| + triage_status.TRIAGED, |
| + getattr(FracasCrashAnalysis, equal_filter) == |
| + triage_status.TRIAGED_CORRECT, |
| + getattr(FracasCrashAnalysis, equal_filter) == |
| + triage_status.TRIAGED_INCORRECT)) |
| + else: |
| + filters.append( |
| + getattr(FracasCrashAnalysis, equal_filter) == |
| + converter(self.request.get(equal_filter))) |
| + |
| + if self.request.get('count'): |
| + count = int(self.request.get('count')) |
| + else: |
| + count = _DEFAULT_DISPLAY_COUNT |
| + |
| + # TODO(katesonia): Add pagination here. |
| + fracas_crash_list = FracasCrashAnalysis.query(ndb.AND(*filters)).order( |
| + FracasCrashAnalysis.requested_time).fetch(count) |
| + fracas_crashes = [] |
| + |
| + for crash in fracas_crash_list: |
| + display_data = { |
| + 'signature': crash.signature, |
| + 'version': crash.crashed_version, |
| + 'channel': crash.channel, |
| + 'platform': crash.platform, |
| + 'regression_range': ('' if not crash.has_regression_range else |
| + crash.result['regression_range']), |
| + 'suspected_cls':crash.result['suspected_cls'], |
| + 'suspected_project': crash.result['suspected_project'], |
| + 'suspected_components': crash.result['suspected_components'], |
| + 'stack_trace': crash.stack_trace, |
| + 'historical_metadata': json.dumps(crash.historical_metadata), |
| + 'crash_identifiers': base64.b64encode( |
|
stgao
2016/06/08 17:53:45
Why we need this? For identifying the crash?
If t
Sharu Jiang
2016/06/09 06:13:28
Done.
|
| + json.dumps(crash.crash_identifiers)) |
| + } |
| + fracas_crashes.append(display_data) |
| + |
| + data = { |
| + 'start_date': time_util.FormatDatetime(start_date), |
| + 'end_date': time_util.FormatDatetime(end_date), |
| + 'found_suspects': self.request.get('found_suspects', '-1'), |
| + 'has_regression_range': self.request.get('has_regression_range', '-1'), |
| + 'suspected_cls_triage_status': self.request.get( |
| + 'suspected_cls_triage_status', '-1'), |
| + 'regression_range_triage_status': self.request.get( |
| + 'regression_range_triage_status', '-1'), |
| + 'fracas_crashes': fracas_crashes |
| + } |
| + |
| + return { |
| + 'template': 'crash/fracas_dashboard.html', |
| + 'data': data |
| + } |