Chromium Code Reviews| Index: appengine/findit/handlers/flake/list_flakes.py |
| diff --git a/appengine/findit/handlers/flake/list_flakes.py b/appengine/findit/handlers/flake/list_flakes.py |
| index 1a33a548c63936b2e1169b4cd7ddefe723e88dbf..62769cca52ad2db1d63d8d42a2557e9b71c82af0 100644 |
| --- a/appengine/findit/handlers/flake/list_flakes.py |
| +++ b/appengine/findit/handlers/flake/list_flakes.py |
| @@ -4,14 +4,21 @@ |
| from google.appengine.ext import ndb |
| +from datetime import datetime |
| +from datetime import time |
| +from datetime import timedelta |
| + |
| from common.base_handler import BaseHandler |
| from common.base_handler import Permission |
| from common import time_util |
| +from model import result_status |
| from model.flake.master_flake_analysis import MasterFlakeAnalysis |
| -def FilterMasterFlakeAnalysis(master_flake_analysis_query, master_name, |
| - builder_name, build_number, step_name, test_name): |
| +def FilterMasterFlakeAnalysis( |
| + master_flake_analysis_query, master_name=None, builder_name=None, |
| + build_number=None, step_name=None, test_name=None, start_date=None, |
| + end_date=None, status_code=result_status.UNSPECIFIED): |
| if master_name: |
| master_flake_analysis_query = master_flake_analysis_query.filter( |
| MasterFlakeAnalysis.master_name == master_name) |
| @@ -27,16 +34,43 @@ def FilterMasterFlakeAnalysis(master_flake_analysis_query, master_name, |
| if test_name: |
| master_flake_analysis_query = master_flake_analysis_query.filter( |
| MasterFlakeAnalysis.test_name == test_name) |
| - if not (master_name or builder_name or build_number or |
| - step_name or test_name): |
| - master_flake_analysis_query.order(-MasterFlakeAnalysis.request_time) |
| + if start_date: |
| + master_flake_analysis_query = master_flake_analysis_query.filter( |
| + MasterFlakeAnalysis.request_time >= start_date) |
| + if end_date: |
| + master_flake_analysis_query = master_flake_analysis_query.filter( |
| + MasterFlakeAnalysis.request_time < end_date) |
| + if status_code != result_status.UNSPECIFIED: |
| + master_flake_analysis_query = master_flake_analysis_query.filter( |
| + MasterFlakeAnalysis.result_status == status_code) |
| + |
| + master_flake_analysis_query.order(-MasterFlakeAnalysis.request_time) |
| return master_flake_analysis_query.fetch() |
| class ListFlakes(BaseHandler): |
| PERMISSION_LEVEL = Permission.ANYONE |
| + def _GetStartAndEndDates(self, triage): # pragma: no cover |
|
chanli
2016/10/21 05:49:28
Add tests? Or you just forgot to remove that pragm
lijeffrey
2016/10/21 20:02:01
Done.
|
| + start_date = None |
| + end_date = None |
| + |
| + if triage: |
| + midnight_today = datetime.combine(time_util.GetUTCNow(), 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) |
|
chanli
2016/10/21 05:49:28
Question: it seems that if I have triage=1 and I w
lijeffrey
2016/10/21 20:02:01
triage=1 only makes it so the date picker shows up
chanli
2016/10/21 22:50:59
I just checked, so if I add triage=1, I can only g
chanli
2016/10/24 20:53:27
Acknowledged.
|
| + |
| + return start_date, end_date |
| + |
| def HandleGet(self): |
| + status_code = int(self.request.get('result_status', '-1')) |
|
chanli
2016/10/21 05:49:28
Is -1 result_status.UNSPECIFIED?
lijeffrey
2016/10/21 20:02:01
Done.
|
| master_name = self.request.get('master_name').strip() |
| builder_name = self.request.get('builder_name').strip() |
| build_number = self.request.get('build_number').strip() |
| @@ -44,11 +78,30 @@ class ListFlakes(BaseHandler): |
| build_number = int(build_number) |
| step_name = self.request.get('step_name').strip() |
| test_name = self.request.get('test_name').strip() |
| + triage = self.request.get('triage') == '1' |
| + |
| + # Only allow querying by start/end dates for admins during triage to avoid |
| + # overcomplicating the UI for other users. |
| + start_date, end_date = self._GetStartAndEndDates(triage) |
| master_flake_analyses = FilterMasterFlakeAnalysis( |
| MasterFlakeAnalysis.query(), master_name, builder_name, build_number, |
| - step_name, test_name) |
| - data = {'master_flake_analyses': []} |
| + step_name, test_name, start_date, end_date, status_code) |
| + |
| + data = { |
| + 'master_flake_analyses': [], |
| + 'result_status_filter': status_code, |
| + 'master_name_filter': master_name, |
| + 'builder_name_filter': builder_name, |
| + 'build_number_filter': build_number, |
| + 'step_name_filter': step_name, |
| + 'test_name_filter': test_name |
| + } |
| + |
| + if triage: # pragma: no cover |
| + data['triage'] = triage |
| + data['start_date'] = start_date |
| + data['end_date'] = end_date |
| for master_flake_analysis in master_flake_analyses: |
| data['master_flake_analyses'].append({ |
| @@ -61,12 +114,14 @@ class ListFlakes(BaseHandler): |
| 'suspected_build': master_flake_analysis.suspected_flake_build_number, |
| 'request_time': time_util.FormatDatetime( |
| master_flake_analysis.request_time), |
| + 'result_status': result_status.RESULT_STATUS_TO_DESCRIPTION.get( |
| + master_flake_analysis.result_status) |
| }) |
| # TODO (stgao): use index instead of in-memory sort. |
| # Index doesn't work for now, possibly due to legacy data. |
| data['master_flake_analyses'].sort( |
| - key=lambda e : e['request_time'], reverse=True) |
| + key=lambda e: e['request_time'], reverse=True) |
| return { |
| 'template': 'flake/dashboard.html', |