| OLD | NEW |
| (Empty) | |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 from datetime import datetime |
| 5 from datetime import time |
| 6 from datetime import timedelta |
| 7 import json |
| 8 |
| 9 from common import time_util |
| 10 from common.base_handler import BaseHandler |
| 11 from common.base_handler import Permission |
| 12 from model.crash.fracas_crash_analysis import FracasCrashAnalysis |
| 13 |
| 14 |
| 15 _EQUAL_FILTER_TO_CONVERTER = { |
| 16 'found_suspects': lambda x: x == 'yes', |
| 17 'has_regression_range': lambda x: x == 'yes', |
| 18 'suspected_cls_triage_status': int, |
| 19 'regression_range_triage_status': int, |
| 20 } |
| 21 |
| 22 _DEFAULT_DISPLAY_COUNT = 500 |
| 23 |
| 24 |
| 25 class FracasDashBoard(BaseHandler): |
| 26 PERMISSION_LEVEL = Permission.ANYONE |
| 27 |
| 28 def HandleGet(self): |
| 29 """Shows Fracas crash analysis results in an HTML page.""" |
| 30 midnight_today = datetime.combine(datetime.utcnow(), time.min) |
| 31 midnight_yesterday = midnight_today - timedelta(days=1) |
| 32 midnight_tomorrow = midnight_today + timedelta(days=1) |
| 33 |
| 34 start = self.request.get('start_date') |
| 35 end = self.request.get('end_date') |
| 36 start_date = (datetime.strptime(start, '%Y-%m-%d') if start else |
| 37 midnight_yesterday) |
| 38 end_date = (datetime.strptime(end, '%Y-%m-%d') if end else |
| 39 midnight_tomorrow) |
| 40 |
| 41 if start or not end: # pragma: no branch |
| 42 # If a start date is specified, get everything since then. |
| 43 query = FracasCrashAnalysis.query( |
| 44 FracasCrashAnalysis.requested_time >= start_date, |
| 45 FracasCrashAnalysis.requested_time < end_date |
| 46 ) |
| 47 else: # pragma: no cover |
| 48 # If no start date specified, then get everything up until end_date. |
| 49 start_date = None |
| 50 query = FracasCrashAnalysis.query( |
| 51 FracasCrashAnalysis.requested_time < end_date |
| 52 ) |
| 53 |
| 54 for equal_filter, converter in _EQUAL_FILTER_TO_CONVERTER.iteritems(): |
| 55 if not self.request.get(equal_filter): |
| 56 continue |
| 57 |
| 58 query = query.filter( |
| 59 getattr(FracasCrashAnalysis, equal_filter) == |
| 60 converter(self.request.get(equal_filter))) |
| 61 |
| 62 if self.request.get('count'): |
| 63 count = int(self.request.get('count')) |
| 64 else: |
| 65 count = _DEFAULT_DISPLAY_COUNT |
| 66 |
| 67 # TODO(katesonia): Add pagination here. |
| 68 fracas_crash_list = query.order( |
| 69 -FracasCrashAnalysis.requested_time).fetch(count) |
| 70 fracas_crashes = [] |
| 71 |
| 72 for crash in fracas_crash_list: |
| 73 display_data = { |
| 74 'signature': crash.signature, |
| 75 'version': crash.crashed_version, |
| 76 'channel': crash.channel, |
| 77 'platform': crash.platform, |
| 78 'regression_range': ('' if not crash.has_regression_range else |
| 79 crash.result['regression_range']), |
| 80 'suspected_cls': crash.result.get('suspected_cls', []), |
| 81 'suspected_project': crash.result.get('suspected_project', ''), |
| 82 'suspected_components': crash.result.get( |
| 83 'suspected_components', []), |
| 84 'stack_trace': crash.stack_trace, |
| 85 'historical_metadata': json.dumps(crash.historical_metadata), |
| 86 'key': crash.key.urlsafe() |
| 87 } |
| 88 fracas_crashes.append(display_data) |
| 89 |
| 90 data = { |
| 91 'start_date': time_util.FormatDatetime(start_date), |
| 92 'end_date': time_util.FormatDatetime(end_date), |
| 93 'found_suspects': self.request.get('found_suspects', '-1'), |
| 94 'has_regression_range': self.request.get('has_regression_range', '-1'), |
| 95 'suspected_cls_triage_status': self.request.get( |
| 96 'suspected_cls_triage_status', '-1'), |
| 97 'regression_range_triage_status': self.request.get( |
| 98 'regression_range_triage_status', '-1'), |
| 99 'fracas_crashes': fracas_crashes |
| 100 } |
| 101 |
| 102 return { |
| 103 'template': 'crash/fracas_dashboard.html', |
| 104 'data': data |
| 105 } |
| OLD | NEW |